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

时间:2017-03-07 04:26:44

标签: linux unix grep tail

我有一个包含不同用户行的日志文件,我实时拖尾这个文件。我想过滤掉仅与我指定的用户相关的行,例如: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开头的任何后续行都属于同一用户,需要显示。我需要一个动态尾部,它将获得与指定用户相关的所有ID(1234),并按如下方式过滤前面的行:

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:???"的所有行。当另一行"用户名= 1234"找到后,提取新ID并使用它来显示具有此新ID的后续行。

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

提前致谢!

1 个答案:

答案 0 :(得分:2)

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

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

第一个模式/操作对记录数组ID:xxx$2Username=1234的条目的ids值。第二个模式/操作对查看ID:xxx条目是否列在ids中;如果是这样,它打印线。 Username=1234行满足两个条件(至少在条目添加到数组后)。

  

我如何使用它,使其像tail一样(即打印新行,因为它们被添加到数据中)?

tail -f logfile | awk …

当然,您从命令的awk部分错过了数据文件的名称。你唯一需要注意的是尾巴不会挂起来等待填充管道缓冲区。它可能不会成为一个问题,但是如果在Awk输入中出现的线要比预期更长,则可能需要仔细查看tail的选项。

  

我意识到ID:XXX并不一定总是来到$ 1的位置......有没有办法将ID与正则表达式匹配,无论它在行中的位置如何($ 1,$ 2,... )?

是:

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

第二行匹配每一行,并且对于行中的每个字段,检查ids数组中是否存在该字段。如果是,则打印该行并突破循环(在此上下文中您可以使用next而不是break,尽管这两者在一般情况下并不相同。)