在管道上使用手表


179

我想运行以下命令:

watch -n 1 tail -n 200 log/site_dev.log | grep Doctrine

但是它没有运行,因为“我认为”是grep试图在手表上而不是在表尾上运行...

有没有办法做类似的事情

watch -n 1 (tail -n 200 log/site_dev.log | grep Doctrine)

非常感谢!

Answers:


269

用引号将命令引起来

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'

2
如果管道中还包含引号(例如awk '{print $3}')怎么办?编辑:像这样
OrangeDog

2
您可以使用\逃脱这些字符,即watch -n 'awk \'{print $3}\''
lev

29

我可能是错的,但是这样难道不是更简单地实现相同的功能(查看匹配的日志行)吗?

tail -f -n 200 log/site_dev.log | grep Doctrine

6
我同意就CPU而言,这可能会更有效,但是在主题“使用带有管道的监视”的上下文中,它不使用监视,因此不是答案。这可能是一个糟糕的示例问题,因为手表和烟斗似乎经常出现在尾巴的背景下。
tudor 2014年

1
不,我认为您混淆了手段和目的。用户显然希望看到Doctrine越来越多的文件,而当他查看工具箱时,唯一发现的是watch。他真正需要知道的是tail -f。另请参见meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland

10
我认为这些都是可接受的答案。最常见的答案正确地回答了提出的确切问题,并且此答案正确地标识了OP为自己创建的XY问题,并首先提供了他们真正想要的解决方案。对于遇到这个问题的人,两个答案都可能很有用。
cdhowie '16

2
我正在寻找一种观看方法shellcheck *.sh | grep line | wc -l,被接受的答案对我很有用。
Amedee Van Gasse

2

您可以在命令周围加上引号:

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'

如果命令中带有引号,则可以使用其他类型的引号并进行适当的转义:

watch -n 1 $'tail -n 200 log/site_dev.log | fgrep \'Doctrine.*\''

如果您想做一些真正聪明的事情,请将一个或多个命令放在脚本中,并与watch一起使用:

cat <<EOF >/tmp/watch-command
tail -n 200 $(pwd)/log/site_dev.log | fgrep Doctrine
EOF
chmod +x /tmp/watch-command
watch /tmp/watch-command

确保必要时考虑相对路径。

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.