題 使用帶管道的手錶


我想運行這個命令:

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)

非常感謝!


154
2018-05-12 19:23


起源




答案:


用引號括住命令

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

245
2018-05-12 19:28



如果管道還包含引號(例如 awk '{print $3}')?編輯: 像這樣 - OrangeDog
你可以用\來逃避那些角色,即 watch -n 'awk \'{print $3}\'' - lev


我可能錯了,但這不會達到同樣的效果(查看匹配的日誌行,因為它們被添加)更簡單嗎?

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

27
2018-05-12 20:16



我同意就CPU而言,這可能更有效,但在“使用帶管道的手錶”主題的背景下,它不使用手錶,所以不是答案。這可能是一個糟糕的例子問題,因為手錶和管道似乎經常出現在尾巴的背景下。 - tudor
不,我認為你混淆了手段和目的。用戶顯然想看 Doctrine 到達一個不斷增長的檔案,當他看著他的工具箱時,他發現的唯一一件事就是 watch。他真正需要知道的是 tail -f。也可以看看 meta.stackexchange.com/questions/66377/what-is-the-xy-problem - dland
我認為這些都是可以接受的答案。頂部和接受的答案正確回答了提出的確切問題,這個答案正確地識別了 XY問題 OP為自己創造並首先提供他們真正想要的解決方案。對於遇到此問題的人來說,這兩個答案都很容易有用。 - cdhowie
我一直在尋找一種觀看方式 shellcheck *.sh | grep line | wc -l 並且接受的答案對我有用。 - Amedee Van Gasse


您可以使用引號括起命令:

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

如有必要,請務必考慮相對路徑。


0
2017-08-27 16:00