使用tail时禁止显示“文件被截断”消息


11

我使用拖尾一个日志文件tail -f messages.log,这是输出的一部分:

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但是无论如何它都会显示消息。

有什么方法可以抑制此消息?

Answers:


15

该消息与所有警告和错误消息一样,在stderr输出

您可以删除所有错误输出:

tail -f file 2> /dev/null

或者仅过滤出包含truncate以下内容的错误消息:

{ tail -f file 2>&1 >&3 3>&- | grep -v truncated >&2 3>&-;} 3>&1

但是,这意味着您将退出的退出状态tail。一些外壳程序具有用于该管道的pipefail选项(已启用set -o pipefail),以报告管道tail失败的退出状态。zsh并且bash还可以在$pipestatus/ $PIPESTATUS数组中报告管道各个组件的状态。

使用zshbash,您可以使用:

tail -f file 2> >(grep -v truncated >&2)

但是请注意,该grep命令不会等待,因此如果tail退出,并且外壳程序已开始在脚本中运行下一个命令,则可能会显示错误消息(如果有)。

在中zsh,您可以通过以下方式解决此问题:

{ tail -f file; } 2> >(grep -v truncated >&2)

zsh文档中对此进行了讨论info zsh 'Process Substitution'

还有一个问题>(PROCESS)。当将此命令附加到外部命令时,父外壳程序不会等待过程完成,因此紧随其后的命令不能依赖于结果是否完整。问题和解决方案与MULTIOS部分中的“ 重定向: ”部分中所述相同。因此,在上述示例的简化版本中:

paste <(cut -f1 FILE1) <(cut -f3 FILE2) > >(PROCESS)

(请注意,不涉及MULTIOS),就父外壳而言,过程将异步运行。解决方法是:

{ paste <(cut -f1 FILE1) <(cut -f3 FILE2) } > >(PROCESS)

这里的额外进程是从父外壳产生的,它将等待其完成。


您有理由宁愿使用subshel​​l而不( )使用复杂的命令{ }吗?
汤姆·黑尔

@TomHale。没有充分的理由。参见编辑。谢谢。
斯特凡Chazelas

2

如果grep没有清除输出,则很可能是在标准错误下打印的。摆脱这种情况的最简单方法是简单地将其转储:

tail -f messages.log 2>/dev/null

1
既能解决问题,又能抑制其他消息。
Bas Peeters 2014年

是的,@StéphaneChazelas的解决方案更复杂,但只忽略了相关信息。
l0b0 2014年

1

也许可以解决此错误的根源。发生这种情况的原因是某些东西用覆盖“>”而不是追加“ >>”写入文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.