Используя часы с трубами

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)

Большое спасибо!

Томми Б.
источник

Ответы:

269

Окружить команду кавычками

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
tonylo
источник
2
Что, если конвейер также содержит кавычки (такие как awk '{print $3}')? Редактировать: Как это
OrangeDog
2
вы можете избежать этих символов с \, т. е.watch -n 'awk \'{print $3}\''
Лев
29

Я могу ошибаться, но разве это не приведет к тому же самому (просмотр соответствующих строк журнала по мере их добавления) проще?

tail -f -n 200 log/site_dev.log | grep Doctrine
Митч
источник
6
Я согласен, что это может быть более эффективным с точки зрения ЦП, но в контексте темы «Использование наблюдения с каналами» он не использует часы, поэтому не является ответом. Это может быть случай плохого примера вопроса, поскольку часы и трубы часто появляются не в контексте хвоста.
tudor
1
Нет, я думаю, что вы путаете средства и цель. Пользователь явно хотел видеть Doctrineпоступающий в растущем файле, и когда он посмотрел в своем наборе инструментов, единственное, что он нашел, было watch. То, что он действительно должен был знать, было tail -f. См. Также meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland
10
Я думаю, что это оба приемлемые ответы. Верхний и принятый ответ правильно отвечает на поставленный вопрос, и этот ответ правильно идентифицирует проблему XY, которую OP создал для себя, и обеспечивает решение, которое он действительно хотел в первую очередь. Оба ответа легко могут быть полезны для кого-то, кто сталкивался с этим вопросом.
cdhowie
2
Я искал способ смотреть, shellcheck *.sh | grep line | wc -lи принятый ответ был полезен для меня.
Амеди Ван
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

Обязательно учитывайте относительные пути, если это необходимо.

bschlueter
источник