Verwenden Sie die Uhr mit Rohren

179

Ich möchte diesen Befehl ausführen:

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

Aber es läuft nicht, weil "ich denke", dass das grep versucht, auf der Uhr statt auf dem Schwanz zu laufen ...

Gibt es eine Möglichkeit, so etwas zu tun?

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

Danke vielmals!

Tommy B.
quelle

Antworten:

269

Umschließen Sie den Befehl mit Anführungszeichen

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine'
Tonylo
quelle
2
Was ist, wenn die Pipeline auch Anführungszeichen enthält awk '{print $3}'? Edit: Wie diese
OrangeDog
2
Sie können diesen Zeichen mit \ entkommen, dhwatch -n 'awk \'{print $3}\''
lev
29

Ich könnte mich irren, aber würde dies nicht das Gleiche bewirken (das Anzeigen übereinstimmender Protokollzeilen, wenn sie hinzugefügt werden)?

tail -f -n 200 log/site_dev.log | grep Doctrine
Mitch
quelle
6
Ich bin damit einverstanden, dass dies in Bezug auf die CPU effizienter ist, aber im Kontext des Themas "Verwenden von Watch mit Pipes" wird Watch nicht verwendet, daher ist dies keine Antwort. Dies könnte ein Fall einer schlechten Beispielfrage sein, da Uhren und Pfeifen häufig nicht im Zusammenhang mit Tail erscheinen.
Tudor
1
Nein, ich glaube, Sie verwechseln Mittel und Zweck. Der Benutzer wollte das DoctrineEintreffen eindeutig in einer wachsenden Datei sehen, und als er in seine Toolbox schaute, war das Einzige, was er fand, das, was er fand watch. Was er wirklich wissen musste, war tail -f. Siehe auch meta.stackexchange.com/questions/66377/what-is-the-xy-problem
dland
10
Ich denke, das sind beide akzeptable Antworten. Die beste und akzeptierte Antwort beantwortet die genaue gestellte Frage richtig, und diese Antwort identifiziert das XY-Problem , das OP für sich selbst erstellt hat, richtig und bietet die Lösung, die sie wirklich wollten. Beide Antworten könnten für jemanden nützlich sein, der auf diese Frage stößt.
CDHOWIE
2
Ich suchte nach einer Möglichkeit, zuzusehen, shellcheck *.sh | grep line | wc -lund die akzeptierte Antwort war nützlich für mich.
Amedee Van Gasse
2

Sie können den Befehl in Anführungszeichen setzen:

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

Wenn der Befehl Anführungszeichen enthält, können Sie einen anderen Anführungszeichentyp mit entsprechender Maskierung verwenden:

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

Wenn Sie versuchen, etwas wirklich Kluges zu tun, setzen Sie den Befehl oder die Befehle in ein Skript und verwenden Sie das mit 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

Stellen Sie sicher, dass Sie bei Bedarf die relativen Pfade berücksichtigen.

bschlueter
quelle