Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用动态grep模式跟踪文件?_Linux_Unix_Grep_Tail - Fatal编程技术网

Linux 如何使用动态grep模式跟踪文件?

Linux 如何使用动态grep模式跟踪文件?,linux,unix,grep,tail,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 (b

我有一个日志文件,其中包含关于不同用户的行,我正在实时跟踪这个文件。我想过滤掉只与我指定的用户相关的行,例如: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:101 Username=1234”这样的行中将动态ID分配给用户。以该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,但当我在一条尾巴后链接greps时,它就不起作用了。但即使可以,我如何“观察”ID的新值并动态更新我的grep模式


提前谢谢

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

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

如何使用它,使其可以像
tail
(即,在添加到数据中时打印新行)

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

我意识到ID:XXX不一定总是在1美元的位置出现。。。有没有一种方法可以将ID与正则表达式相匹配,而不考虑它在行中的位置($1,$2,…)

是的:

awk'$2==“Username=1234”{ids[$1]++;}

{for(i=1;非常感谢!它似乎正是我要寻找的!!但是我如何使用它,使它可以像tail一样工作(即,在将新行添加到数据中时打印新行?)使用
tail-f logfile | awk…
无限期地继续阅读。伙计,你太棒了!!就是这样!!最后一件事…我意识到ID:XXX不一定总是位于$1位置…有没有办法将ID与正则表达式匹配,而不管它在行中的位置($1,$2,…)?我最近遇到了一个从未退出| awk
命令行的
程序,主要问题是:如果
awk
从管道进行缓冲读取,您可能无法及时看到所有输出。这对于
gawk
似乎不是问题,但是对于
mawk
,这是某些发行版上的默认awk,它有助于添加
-W交互式
选项,以便使用非缓冲读取
awk '$2 == "Username=1234" { ids[$1]++; } $1 in ids  { print }' data
tail -f logfile | awk …
awk '$2 == "Username=1234" { ids[$1]++; }
     { for (i = 1; i <= NF; i++) if ($i in ids) { print; break }' data