我正在使用尾随日志文件tail -f messages.log,这是输出的一部分:
Run Code Online (Sandbox Code Playgroud)Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eget tellus sit amet odio porttitor rhoncus. Donec consequat diam sit amet tellus viverra pellentesque. tail: messages.log: file truncated Suspendisse at risus id neque pharetra finibus in facilisis ipsum.
它显示tail: messages.log: file truncated文件何时被自动截断并且应该发生这种情况,但我只想tail向我显示没有此截断消息的输出。
我试过使用,tail -f messages.log | grep -v truncated但它仍然向我显示消息。
有什么方法可以抑制此消息?
Sté*_*las 21
该消息像所有警告和错误消息一样在stderr上输出。
您可以删除所有错误输出:
tail -f file 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
或者仅过滤掉包含truncate以下内容的错误消息:
{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1
Run Code Online (Sandbox Code Playgroud)
但是,这意味着您将失去tail. 一些 shell 有一个pipefail选项(使用 启用set -o pipefail),用于该管道报告tail其失败时的退出状态。zsh并且bash还可以在它们的$pipestatus/$PIPESTATUS数组中报告管道的各个组件的状态。
使用zsh或bash,您可以使用:
tail -f file 2> >(grep -v truncated >&2)
Run Code Online (Sandbox Code Playgroud)
但请注意,该grep命令不会被等待,因此tail退出后可能会显示错误消息(如果有),并且 shell 已经开始运行脚本中的下一个命令。
在 中zsh,您可以通过编写它来解决这个问题:
{ tail -f file; } 2> >(grep -v truncated >&2)
Run Code Online (Sandbox Code Playgroud)
zsh文档中对此进行了讨论info zsh 'Process Substitution':
还有一个额外的问题
>(PROCESS);当它附加到外部命令时,父 shell 不会等待 PROCESS 完成,因此紧随其后的命令不能依赖于结果是否完成。问题和解决方案是相同的部分所述MULTIOS在笔记重定向::。因此,在上述示例的简化版本中:Run Code Online (Sandbox Code Playgroud)paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)(请注意,不涉及 MULTIOS),就父 shell 而言,PROCESS 将异步运行。解决方法是:
Run Code Online (Sandbox Code Playgroud){ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)这里的额外进程是从父 shell 产生的,它将等待它们完成。