2017-03-07 24 views
-1

我有一个包含关于不同用户的行的日志文件,我正在实时拖曳这个文件。我想筛选出那些只关系到我指定用户,前行:1234的日志条目是这样的:我如何使用动态grep模式来定尾文件?

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用户名= 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 

我需要先过滤线,其中“用户名= 1234”被发现,然后提取“ID:???”从那行开始,然后尾部包含“ID:???”的所有行。当找到另一行带有“用户名= 1234”的行时,提取新的ID并使用它显示具有这个新ID的后续行。

我可以链接greps来过滤ID,当我使用猫,但它不起作用,当我把它们链接在一个尾巴后。但即使我可以,我如何“观察”一个新的ID值并动态更新我的grep模式?

在此先感谢!

回答

2

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

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

第一图案/动作对记录了一个条目,其中$2是阵列idsUsername=1234中的ID:xxx值。第二种模式/动作对查看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,尽管两者通常并不相同)。

+0

非常感谢!这似乎正是我正在寻找的!但是,我如何使用它,以便它能像尾巴一样行事(即在添加到数据中时打印新行?)。 –

+0

使用'tail -f logfile | awk ...'无限期地继续阅读。 –

+0

你真棒!这就是它!只是最后一件事......我意识到ID:XXX并不一定总是在位置$ 1 ......有没有办法将ID与正则表达式匹配,而不管它在行中的位置($ 1,$ 2,...)。 ..)? –

相关问题