Verwendung des Befehls watch mit einer Pipe-Kette von Befehlen / Programmen

50

Normalerweise watchbenutze ich ein Linux-Dienstprogramm, um die Ausgabe eines Befehls wiederholt alle n Sekunden zu sehen, wie inwatch df -h /some_volume/

Aber ich scheine nicht in der Lage zu sein, watchmit einer Pipe-Reihe von Befehlen wie:

$ watch ls -ltr|tail -n 1

Wenn ich das mache, watchgucke ich wirklich ls -ltrund die Ausgabe wird an die weitergeleitet, tail -n 1die nichts ausgibt.

Wenn ich das versuche:

$ watch (ls -ltr|tail -n 1)

Ich bekomme

$ watch: syntax error near unexpected token `ls'

Und einer der folgenden Gründe schlägt fehl:

$ watch <(ls -ltr|tail -n 1)

$ watch < <(ls -ltr|tail -n 1)

$ watch $(ls -ltr|tail -n 1)

$ watch `ls -ltr|tail -n 1)`

Und schließlich, wenn Sie dies tun:

$ watch echo $(ls -ltr|tail -n 1)

Ich sehe keine Änderung in der Ausgabe im angegebenen Intervall, da der Befehl $()nur einmal ausgeführt wird und die resultierende Ausgabezeichenfolge immer als Literal gedruckt ("überwacht") wird.

Wie lasse ich den watchBefehl mit einer Pipe-Kette von Befehlen arbeiten [abgesehen davon, dass sie in ein Skript eingefügt werden]?

Tulains Córdova
quelle
laufen man watchund nach unten scrollen , um Beispielen ...
don_crissti

Antworten:

80
watch 'command | othertool | yet-another-tool'
DopeGhoti
quelle
1
Erwähnenswert wäre auch der generische Ansatz, watch sh -c 'command | etc'insbesondere die in der Frage erprobten Ansätze.
Sourcejedi
@sourcejedi Ich habe nicht wirklich herausgefunden, warum, aber dies führt nicht immer zu den gleichen Ergebnissen.
Michael Mior
10
watch -n 1 "ls -lrt | tail -n20; date"

Lass uns pfeifen und in einer Reihe rennen.

Soft Dot IE
quelle
Wofür ist das -n 1?
Nam G VU
2
@NamGVU: Führen Sie den Befehl alle 1 Sekunde aus
Duc Tran
1

Wenn Sie auch alle Dateien in Unterverzeichnissen auflisten möchten, können Sie den Befehl find mit der Option exec verwenden.

watchwird alle 30 Sekunden aktualisiert und findsucht nach allen * .log-Dateien im aktuellen Verzeichnis (einschließlich Unterverzeichnissen) und gibt die Dateinamen und ihre letzten 10 Zeilen aus:

watch -n30 'find . -name "*.log" -print -exec tail -n10 {} \; '
yoyomanYo
quelle