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

32119
TomShreds

Я хотел бы запустить эту команду:

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) 

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

155

3 ответа на вопрос

247
tonylo

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

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine' 
Что если конвейер также содержит кавычки (например, `awk ''`)? Изменить: [Мне нравится] (https://stackoverflow.com/a/16408155/476716) OrangeDog 6 лет назад 2
вы можете избежать этих символов с помощью \, то есть `watch -n 'awk \' \ ''` lev 6 лет назад 0
27
Mitch

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

tail -f -n 200 log/site_dev.log | grep Doctrine 
Я согласен, что это может быть более эффективным в отношении процессора, но в контексте темы «Использование наблюдения с каналами» он не использует часы, поэтому не является ответом. Это может быть случай плохого примера вопроса, поскольку часы и трубы часто появляются не в контексте хвоста. tudor 10 лет назад 5
Нет, я думаю, что вы путаете средства и цель. Пользователь явно хотел видеть, как «Доктрина» появляется в растущем файле, и когда он посмотрел в своем наборе инструментов, единственное, что он обнаружил, это «часы». Что ему действительно нужно было знать, так это «tail -f». Смотрите также http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem dland 8 лет назад 0
Я думаю, что это оба приемлемых ответа. Верхний и принятый ответ правильно отвечает на точный поставленный вопрос, и этот ответ правильно определяет [проблему XY] (http://meta.stackexchange.com/a/66378/218910), которую OP создал для себя, и предоставляет решение, которое он действительно хотел в первую очередь. Оба ответа легко могут быть полезны для кого-то, кто сталкивался с этим вопросом. cdhowie 8 лет назад 9
Я искал способ посмотреть `shellcheck * .sh | grep line | wc -l` и принятый ответ был полезен для меня. Amedee Van Gasse 7 лет назад 0
0
bschlueter

Вы можете заключить команду в кавычки:

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 

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