Linux 如何在跟踪文件时使用每个GREP结果执行命令
TL;DR:如何在将tail-f导入grep时对生成的每个grep匹配执行命令 我目前正在使用Linux 如何在跟踪文件时使用每个GREP结果执行命令,linux,bash,shell,grep,tail,Linux,Bash,Shell,Grep,Tail,TL;DR:如何在将tail-f导入grep时对生成的每个grep匹配执行命令 我目前正在使用tail-f file | grep exception跟踪服务引发的所有异常。问题之一是,出现异常的行没有我需要的所有信息,但它确实包含一个标识该请求生成的所有日志行的ID 我想做的是,一旦grep匹配了一行异常,就打印出所有具有特定ID的行 使用此问题的帮助 我设法使它适用于CAT命令,如下所示: cat myFile | egrep -i "exception" | #find lines w
tail-f file | grep exception
跟踪服务引发的所有异常。问题之一是,出现异常的行没有我需要的所有信息,但它确实包含一个标识该请求生成的所有日志行的ID
我想做的是,一旦grep匹配了一行异常,就打印出所有具有特定ID
的行
使用此问题的帮助
我设法使它适用于CAT
命令,如下所示:
cat myFile |
egrep -i "exception" | #find lines with exception
egrep -o "ID=[A-Z]{10}" | #for those lines, select out only the id
while read line; do #for each id
cat myFile | grep $line; #show all the lines that have that id
done
这可以很好地工作,并打印所有具有匹配ID的行,但是当我将
cat
更改为tail-f
时,它不会工作,也不会打印任何内容。我做错了什么?您遇到的问题可能是grep在看到其输出是另一个管道时正在缓冲其输出。如果等待缓冲区填满足够长的时间,您的命令最终可能会生成输出
相反,请尝试以下操作:
< myFile egrep --line-buffered -i "exception" \
| egrep --line-buffered -o "ID=[A-Z]{10}" \
| while read line; do
cat myFile | grep "$line"
done
如果你不知道自己在寻找什么,这显然不会对你有多大帮助-P
请注意,在Linux世界中,您使用的是Linux,其中您的手册页可能会声明“不推荐使用egrep或fgrep进行直接调用,但允许依赖它们的历史应用程序不经修改地运行。”尽管说实话,我看不到egrep和其他平台(FreeBSD、OSX)会消失不要提及贬损
--line-buffered
Use line buffering on output. This can cause a performance penalty.