如何使用动态 grep 模式尾部文件?

how can I tail a file with a dynamic grep pattern?

我有一个日志文件,其中包含有关不同用户的行,我正在实时跟踪该文件。我想过滤掉仅与我指定的用户相关的行,例如:1234。日志条目如下所示:

ID:101 Username=1234
ID:102 Username=1234
ID:999 UNWANTED LINE (because this ID was not assigned to user 1234)
ID:102 some log entry regarding the same user
ID:123 UNWANTED LINE (because this ID was not assigned to user 1234)
ID:102 some other text
ID:103 Username=1234
ID:103 blablabla

一个动态 ID 被分配给像 "ID:101 Username=1234" 这样的行中的用户。以该 ID 开头的任何后续行都属于同一用户,需要显示。我需要一个动态尾巴,它将获取与指定用户 (1234) 相关的所有 ID,并按如下方式过滤前面的行:

ID:101 Username=1234
ID:102 Username=1234
ID:102 some log entry regarding the same user
ID:102 some other text
ID:103 Username=1234
ID:103 blablabla

我需要先过滤找到 "Username=1234" 的行,然后从该行中提取 "ID:???",然后尾部包含 "ID:???" 的所有行。当找到带有 "Username=1234" 的另一行时,提取新 ID 并使用它来显示具有此新 ID 的后续行。

当我使用 cat 时,我可以链接 greps 以过滤掉 ID,但是当我将它们链接在尾巴之后时它不起作用。但即使我可以,我如何 "watch" 获取 ID 的新值并动态更新我的 grep 模式???

提前致谢!

这是 Awk 可以轻松处理的任务(也可以用 Perl 或 Python 处理)。

awk ' == "Username=1234" { ids[]++; }  in ids  { print }' data

第一个 pattern/action 对记录数组 ids</code> 为 <code>Username=1234 的条目的 ID:xxx 值。第二对 pattern/action 查找 ID:xxx 条目是否在 ids 中列出;如果是这样,它会打印该行。 Username=1234 行满足这两个条件(至少在将条目添加到数组后)。

How do I use it so it can act like tail (i.e. print the new lines as they're added to data)?

tail -f logfile | awk …

当然,您会在命令的 awk 部分错过数据文件的名称。您唯一需要注意的是 tail 不会挂起等待填充管道缓冲区。这可能不是问题,但如果在 Awk 输入中出现行的时间比您预期的要长,您可能需要仔细查看 tail 的选项。

I realized that ID:XXX doesn't necessarily always come at position ... is there a way to match the ID with a regular expression regardless of its position in the line (, , ...)?

是:

awk ' == "Username=1234" { ids[]++; }
     { for (i = 1; i <= NF; i++) if ($i in ids) { print; break }' data

第二行匹配每一行,对于行中的每个字段,检查该字段是否存在于 ids 数组中。如果是,它会打印该行并跳出循环(在这种情况下,您可以使用 next 而不是 break,尽管这两者通常并不等同)。