Usando reloj con tubos

179

Me gustaría ejecutar este comando:

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

Pero no funciona, porque "creo" que el grep intenta correr en el reloj en lugar de la cola ...

¿Hay alguna manera de hacer algo como

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

¡Muchas gracias!

Tommy B.
fuente

Respuestas:

269

Rodea el comando con comillas

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
tonylo
fuente
2
¿Qué pasa si la tubería también contiene comillas (como awk '{print $3}')? Editar: Me gusta esto
OrangeDog
2
puedes escapar de esos caracteres con \, es decirwatch -n 'awk \'{print $3}\''
lev
29

Podría estar equivocado, pero ¿no lograría esto lo mismo (ver líneas de registro coincidentes a medida que se agregan) de manera más simple?

tail -f -n 200 log/site_dev.log | grep Doctrine
Mitch
fuente
66
Estoy de acuerdo en que esto puede ser más eficiente en lo que respecta a la CPU, pero en el contexto del tema "Usar watch con tuberías" no usa watch, así que no es una respuesta. Este podría ser el caso de una pregunta de ejemplo deficiente, ya que el reloj y las tuberías parecen aparecer con frecuencia no en el contexto de la cola.
Tudor
1
No, creo que estás confundiendo los medios y el fin. El usuario claramente quería ver Doctrinellegar en un archivo en crecimiento, y cuando miró en su caja de herramientas, lo único que encontró fue watch. Lo que realmente necesitaba saber era tail -f. Ver también meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland el
10
Creo que estas son respuestas aceptables. La respuesta superior y aceptada responde correctamente la pregunta exacta planteada, y esta respuesta identifica correctamente el problema XY que OP creó para sí mismos y proporciona la solución que realmente querían en primer lugar. Ambas respuestas podrían ser fácilmente útiles para alguien que se encuentre con esta pregunta.
cdhowie
2
Estaba buscando una manera de mirar shellcheck *.sh | grep line | wc -ly la respuesta aceptada fue útil para mí.
Amedee Van Gasse
2

Puede rodear el comando con comillas:

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

Si el comando tiene comillas, puede usar un tipo diferente de comillas con escape apropiado:

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

Si está intentando hacer algo realmente inteligente, coloque el comando o los comandos en un script y úselo con 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

Asegúrese de tener en cuenta las rutas relativas si es necesario.

bschlueter
fuente