如何在管道命令/程序链中使用监视命令


50

我通常使用watchlinux实用程序每n秒重复观察一次命令的输出,例如watch df -h /some_volume/

但是我似乎无法使用watch一系列管道命令:

$ watch ls -ltr|tail -n 1

如果我这样做的话,watch实际上ls -ltr是在监视并且输出正在传递给tail -n 1它,什么也不会输出。

如果我尝试这样做:

$ watch (ls -ltr|tail -n 1)

我懂了

$ watch: syntax error near unexpected token `ls'

并且以下任何一项由于某种原因而失败:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

最后,如果这样做:

$ watch echo $(ls -ltr|tail -n 1)

我看不到给定时间间隔的输出变化,因为其中的命令$()只运行了一次,并且输出的输出字符串始终作为文字打印(“监视”)。

那么,如何使该watch命令与管道的一系列命令一起工作(将它们放入脚本中除外)?


运行man watch并向下滚动至示例...
don_crissti

Answers:


80
watch 'command | othertool | yet-another-tool'

1
可能还应注意通用方法,watch sh -c 'command | etc'尤其是查看问题中尝试的方法。
sourcejedi

@sourcejedi我还没有真正弄清楚为什么,但这不会总是产生相同的结果。
Michael Mior

10
watch -n 1 "ls -lrt | tail -n20; date"

让我们通过管道连续运行。


-n 1为了什么?
南极VU

2
@NamGVU:每1秒运行一次命令
Duc Tran

1

如果您还要列出子目录中的所有文件,则可以将find命令与exec选项一起使用。

watch将每30秒更新一次,并find在当前目录(包括子目录)中搜索所有* .log文件,并打印文件名及其最后10行:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
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.