使用带管道的手表

Tom*_* B. 211 bash grep tail watch

我想运行这个命令:

watch -n 1 tail -n 200 log/site_dev.log | grep Doctrine
Run Code Online (Sandbox Code Playgroud)

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

有没有办法做类似的事情

watch -n 1 (tail -n 200 log/site_dev.log | grep Doctrine)
Run Code Online (Sandbox Code Playgroud)

非常感谢!

小智 309

用引号将命令括起来

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
Run Code Online (Sandbox Code Playgroud)

  • 如果管道还包含引号(例如`awk '{print $3}'`)怎么办?编辑:[像这样](/sf/answers/1148570881/) (3认同)
  • 你可以用 \ 转义这些字符,即`watch -n 'awk \'{print $3}\''` (3认同)

Mit*_*tch 31

我可能是错的,但这不会更简单地实现同样的事情(查看添加的匹配日志行)吗?

tail -f -n 200 log/site_dev.log | grep Doctrine
Run Code Online (Sandbox Code Playgroud)

  • 我认为这都是可以接受的答案。顶部和接受的答案正确地回答了提出的确切问题,这个答案正确地识别了 OP 为自己创建的 [XY 问题](http://meta.stackexchange.com/a/66378/218910) 并提供了他们真正的解决方案一开始就想要。对于遇到这个问题的人来说,这两个答案都很容易有用。 (11认同)
  • 我同意就 CPU 而言这可能更有效,但在“使用带管道的手表”主题的上下文中,它不使用手表,因此不是答案。这可能是一个糟糕的示例问题,因为 watch 和 pipe 似乎经常不在 tail 的上下文中出现。 (8认同)
  • 我正在寻找一种方法来观看`shellcheck *.sh | grep线| wc -l` 和接受的答案对我有用。 (2认同)

Sch*_*ter 6

您可以用引号将命令括起来:

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
Run Code Online (Sandbox Code Playgroud)

如果命令中有引号,您可以使用不同类型的引号并进行适当的转义:

watch -n 1 $'tail -n 200 log/site_dev.log | fgrep \'Doctrine.*\''
Run Code Online (Sandbox Code Playgroud)

如果您正在尝试做一些非常聪明的事情,请将一个或多个命令放入脚本中并与 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
Run Code Online (Sandbox Code Playgroud)

如有必要,请确保考虑相对路径。