我运行一个称为STM程序。 我想只保存那些包含在一个文本文件中的文本“ERROR”标准错误消息。 我也想在控制台上的消息。
我该怎么做,在bash中?
我运行一个称为STM程序。 我想只保存那些包含在一个文本文件中的文本“ERROR”标准错误消息。 我也想在控制台上的消息。
我该怎么做,在bash中?
使用下面的管道,如果只包含信息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 )
这看起来像的复制品如何管标准错误,而不是标准输出?
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
你是说你想同时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命令。