Usando l'orologio con i tubi


179

Vorrei eseguire questo comando:

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

Ma non funziona, perché "Penso" che il grep prova a correre sull'orologio invece che sulla coda ...

C'è un modo per fare qualcosa del genere

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

Molte grazie!

Risposte:


269

Circonda il comando tra virgolette

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

2
Cosa succede se la pipeline contiene anche virgolette (come awk '{print $3}')? Modifica: In questo modo
OrangeDog,

2
puoi sfuggire a quei caratteri con \, cioèwatch -n 'awk \'{print $3}\''
lev

29

Potrei sbagliarmi, ma questo non otterrebbe la stessa cosa (visualizzando le righe di log corrispondenti man mano che vengono aggiunti) più semplicemente?

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

6
Sono d'accordo che questo potrebbe essere più efficiente per quanto riguarda la CPU, ma nel contesto dell'argomento "Uso di watch con pipe" non utilizza watch, quindi non è una risposta. Questo potrebbe essere il caso di una domanda di scarso esempio in quanto orologio e tubi sembrano apparire spesso non nel contesto della coda.
Tudor,

1
No, penso che tu stia confondendo i mezzi e il fine. L'utente voleva chiaramente vedere Doctrinearrivare in un file in crescita e quando guardò nella sua cassetta degli attrezzi, l'unica cosa che trovò fu watch. Quello che aveva davvero bisogno di sapere era tail -f. Vedi anche meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland

10
Penso che queste siano entrambe risposte accettabili. La risposta migliore e accettata risponde correttamente alla domanda esatta posta, e questa risposta identifica correttamente il problema XY che OP ha creato per se stesso e fornisce la soluzione che desideravano davvero in primo luogo. Entrambe le risposte potrebbero facilmente essere utili a qualcuno che incontra questa domanda.
cdhowie,

2
Stavo cercando un modo per guardare shellcheck *.sh | grep line | wc -le la risposta accettata mi è stata utile.
Amedee Van Gasse,

2

Puoi racchiudere il comando tra virgolette:

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

Se il comando contiene virgolette, puoi utilizzare un diverso tipo di virgolette con escape appropriato:

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

Se stai cercando di fare qualcosa di veramente intelligente, inserisci il comando oi comandi in uno script e usalo 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

Assicurati di tenere conto dei percorsi relativi, se necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.