如何在终止文件时使用每个GREP结果执行命令

时间:2015-09-24 19:11:51

标签: linux bash shell grep tail

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它不会工作时,它不会打印任何内容。我做错了什么?

1 个答案:

答案 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)也没有提及弃用。