bash command to grep something on stderr and save

2019-09-01 15:16发布

我运行一个称为STM程序。 我想只保存那些包含在一个文本文件中的文本“ERROR”标准错误消息。 我也想在控制台上的消息。

我该怎么做,在bash中?

Answer 1:

使用下面的管道,如果只包含信息ERROR应控制台(错误)上显示:

stm |& grep ERROR | tee -a /path/to/logfile

使用下面的命令,如果所有消息应控制台(错误)上显示:

stm |& tee /dev/stderr | grep ERROR >> /path/to/logfile

编辑:版本,无需连接标准输出和标准错误:

stm 2> >( grep --line-buffered ERROR | tee -a /path/to/logfile >&2 )
stm 2> >( tee /dev/stderr | grep --line-buffered ERROR >> /path/to/logfile )


Answer 2:

这看起来像的复制品如何管标准错误,而不是标准输出?

stderr重定向到“&1”,意思是“相同的地方标准输出会”。 再将stdout到/ dev / null的。 然后用一个正常的管道。

$ date -g
date: invalid option -- 'g'
Try `date --help' for more information.
$
$ (echo invent ; date -g)
invent                                    (stdout)
date: invalid option -- 'g'               (stderr)
Try `date --help' for more information.   (stderr)
$
$ (echo invent ; date -g) 2>&1 >/dev/null | grep inv
date: invalid option -- 'g'
$ 

从上述命令的输出复制到文件中,你可以使用>重定向或“三通”。 tee命令将打印输出的一个副本到控制台和第二拷贝到该文件。

$ stm 2>&1 >/dev/null | grep ERROR > errors.txt

要么

$ stm 2>&1 >/dev/null | grep ERROR | tee errors.txt


Answer 3:

你是说你想同时stderr和标准输出出现在控制台中,但只有包含“ERROR”标准错误(不标准输出)被记录到一个文件? 这是最后一个条件,使得它很难找到一个很好的解决方案。 如果这是你在找什么,这是我很丑陋的解决方案:

touch stm.out stm.err
stm 1>stm.out 2>stm.err & tail -f stm.out & tail -f stm.err & \
wait `pgrep stm`; pkill tail; grep ERROR stm.err > error.log; rm stm.err stm.out

我警告你以为这是丑陋的。 你可以把它藏在一个函数,使用mktemp的创建临时文件名等,如果你不想等待STM来记录错误文本文件之前退出,您可以添加tail -f stm.err | grep ERROR > error.log & tail -f stm.err | grep ERROR > error.log &其他尾的命令后,和从最后一行除去grep命令。



文章来源: bash command to grep something on stderr and save the result in a file
标签: bash shell