我似乎遇到一个问题,一个简单的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
谢谢,
贝
答案 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
感谢您的建议。