管道中的多个greps在完成后不会终止

时间:2011-05-04 17:49:40

标签: linux bash grep

我似乎遇到一个问题,一个简单的grep语句在完成后没有完成/终止。

例如:

 grep -v -E 'syslogd [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: restart' |
 grep -v 'printStats: total reads from cache:' /var/log/customlog.log >\
 /tmp/filtered_log.tmp

上述语句将删除内容并将其保存到临时文件中,但是在grep完成处理整个文件后,shell脚本将挂起并且无法再继续。在命令行中手动运行命令时也会触发此行为。基本上组合多个grep语句会导致类似PAGER的操作(more / less)。

有没有人有任何建议可以克服这个限制?理想情况下,我不想做以下事情,因为customlog.log文件有时会变得很大。

cat /var/log/customlog.log |
grep -v -E 'syslogd [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: restart' |
grep -v 'printStats: total reads from cache:' > /tmp/filtered_log.tmp

谢谢,

1 个答案:

答案 0 :(得分:3)

如上所述,您需要在此处移动您的文件名:

grep -v -E \
    'syslogd [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: restart' /var/log/customlog.log
| grep -v 'printStats: total reads from cache:' > /tmp/filtered_log.tmp

但你也可以结合两个greps:

grep -v -E \
    -e 'syslogd [0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}: restart' \
    -e  'printStats: total reads from cache:' /var/log/customlog.log > \
    /tmp/filtered_log.tmp

保存一点CPU并同时修复错误。

BTW,另一个可能的问题:如果这个脚本的两个实例同时运行怎么办?两者都将使用相同的临时文件。在这种特殊情况下,这可能不是问题,但您可能习惯于为这种情况开发脚本。我建议您使用$$将进程ID放在临时文件中:

tempFileName="/tmp/filtered_log.$$.tmp"
grep -v -E -e [blah... blah.. blah] /var/log/customlog.log > $tempFileName

现在,如果两个不同的人正在运行此过程,您将无法使用相同的临时文件获取它们。


追加

正如uwe-kleine-konig指出的那样,你最好使用mktemp

tempFileName=$(mktemp filtered_log.XXXXX)
grep -v -E -e [blah... blah.. blah] /var/log/customlog.log > $tempFileName

感谢您的建议。