TL; DR:如何在将tail -f导入grep时生成的每个grep匹配上执行命令。
我目前正在使用tail -f file | grep exception
来关注服务引发的所有异常。其中一个问题是,具有异常的行没有我需要的所有信息,但它确实包含一个ID
,用于标识该请求生成的所有日志行。
我想要做的是在grep与异常行匹配时打印具有特定ID
的所有行。
使用此问题的帮助 How to grep and execute a command (for every match)
我设法让它适用于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
它不会工作时,它不会打印任何内容。我做错了什么?
答案 0 :(得分:2)
您遇到的问题可能是当grep看到其输出是另一个管道时缓冲其输出。如果你等待足够长的时间来填充缓冲区,那么你的命令可能最终产生输出。
相反,请尝试以下方法:
< myFile egrep --line-buffered -i "exception" \
| egrep --line-buffered -o "ID=[A-Z]{10}" \
| while read line; do
cat myFile | grep "$line"
done
(是的,那个输入重定向选项应该可以正常工作。:])
相关的手册页摘录如下:
--line-buffered
Use line buffering on output. This can cause a performance penalty.
除非你知道自己在寻找什么,否则显然不会对你有所帮助。 :-P
请注意,在Linux世界中,您正在使用Linux,其中您的手册页可能会声明&#34;直接调用egrep或fgrep已被弃用,但提供它是为了允许依赖它们的历史应用程序未经修改地运行。&#34;虽然说实话,但我并没有看到egrep消失,其他平台(FreeBSD,OSX)也没有提及弃用。