Uhr mit Pfeifen verwenden

32290
TomShreds

Ich möchte diesen Befehl ausführen:

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

Aber es läuft nicht, denn "Ich denke", dass der Grep versucht, statt des Schwanzes auf der Uhr 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!

155

3 Antworten auf die Frage

247
tonylo

Umgeben Sie den Befehl mit Anführungszeichen

watch -n 1 'tail -n 200 log/site_dev.log | fgrep Doctrine' 
Was ist, wenn die Pipeline auch Anführungszeichen enthält (z. B. `awk ''`)? Bearbeiten: [Gefällt mir] (https://stackoverflow.com/a/16408155/476716) OrangeDog vor 6 Jahren 2
Sie können diesen Zeichen mit \ entkommen, dh `watch -n 'awk \' \ ''` lev vor 6 Jahren 0
27
Mitch

Ich bin vielleicht falsch, aber würde das nicht einfacher sein (übereinstimmende Protokollzeilen anzeigen, wenn sie hinzugefügt werden), dann einfacher?

tail -f -n 200 log/site_dev.log | grep Doctrine 
Ich stimme zu, dass dies in Bezug auf die CPU möglicherweise effizienter ist, aber im Zusammenhang mit dem Thema "Verwenden von Watch mit Pipes" wird Watch nicht verwendet, also keine Antwort. Dies könnte ein Beispiel für eine schlechte Beispielfrage sein, da Watch und Pipes häufig nicht im Kontext von Tail erscheinen. tudor vor 10 Jahren 5
Nein, ich denke, Sie verwirren die Mittel und das Ende. Der Benutzer wollte eindeutig sehen, dass "Doctrine" in einer wachsenden Datei ankam, und als er in seinen Werkzeugkasten sah, war das einzige, was er fand, "watch". Was er wirklich wissen musste, war "tail -f". Siehe auch http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem dland vor 8 Jahren 0
Ich denke, das sind beide akzeptable Antworten. Die oberste und akzeptierte Antwort beantwortet die exakte Frage richtig, und diese Antwort identifiziert das [XY-Problem] (http://meta.stackexchange.com/a/66378/218910), das das OP für sich selbst erstellt hat, richtig und bietet die Lösung, die es tatsächlich bietet wollte an erster Stelle. Beide Antworten könnten für jemanden, der auf diese Frage stößt, leicht nützlich sein. cdhowie vor 8 Jahren 9
Ich war auf der Suche nach einer Möglichkeit, Shellcheck * .sh | grep line | wc -l` und die akzeptierte Antwort war für mich nützlich. Amedee Van Gasse vor 7 Jahren 0
0
bschlueter

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 eine andere Art von Anführungszeichen mit entsprechender Escape-Anweisung verwenden:

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

Wenn Sie versuchen, etwas wirklich Kluges zu tun, fügen Sie den Befehl oder die Befehle in ein Skript ein 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 ggf. relative Pfade berücksichtigen.