Überwachen und bedingte Reaktion auf fortlaufende Befehlsausgabe

398
dave mankoff

In Bash läuft ein Befehl auf dem Bildschirm, der effektiv ist:

while true do echo $RANDOM sleep 1 done 

Die Ausgabe davon ist:

12396 19683 31641 ... 

Ich würde das gerne in etwas wie grep / awk leiten und ein bestimmtes Muster anpassen, zum Beispiel 12345: Ich möchte, dass ein Befehl ausgeführt wird.

Ich möchte nicht die volle Ausgabe des laufenden Befehls erfassen - er kann sehr lange laufen, bevor eine Übereinstimmung gefunden wird, und ich möchte keinen Platz auf der Maschine verschwenden.

Kann das in bash leicht gemacht werden?

In einer idealen Welt möchte ich auch, dass die Ausgabe weiterhin auf dem Terminal gedruckt wird, sodass ich die Ausgabe selbst steuern und überwachen kann. Dies ist jedoch nicht unbedingt erforderlich.

1

1 Antwort auf die Frage

1
Kamil Maciorowski
./feeding_script.sh | tee >(while read a; do [ "$a" == "12345" ] && </dev/null another_command; done) 

Anmerkungen:

  • teeteilt den Datenstrom auf; Eine Kopie geht in eine "Datei", die in diesem Fall ein Befehl ist >(…), die andere geht zum Terminal weiter;
  • </dev/null another_command- Diese Weiterleitung verhindert, dass die another_commandvon generierten Daten verwendet werden feeding_script.sh.
Warum ist das ` Xen2050 vor 6 Jahren 0
@ Xen2050 Wenn `another_command` sich von` stdin` (ohne Umleitung) selbst versorgen könnte, kann es eine beliebige Anzahl von Zeilen verbrauchen, die auf das auslösende `12345` folgen. Diese Zeilen würden niemals "beim Lesen ..." gehen. Ich nahm an, dass sie alle dorthin gehen und getestet werden sollten. Aber * wenn * die Idee ist, `12345` als Header zu erkennen, der Daten vorausgeht, die * an` another_command` gehen sollen, dann ` Kamil Maciorowski vor 6 Jahren 0