Stoppen nach der ersten Zeile der Ausgabe

4532
petersohn

Ich versuche in einem Bash-Skript Folgendes zu tun: Führen Sie einen Befehl aus (z. B. tail -f log_file), warten Sie, bis eine bestimmte Ausgabe eintrifft, stoppen Sie den Befehl und fahren Sie mit dem Skript fort.

Ich habe folgendes versucht, aber es hat nicht funktioniert:

tail -f log_file | grep some_text | head -n1 

Ich habe auf diese Weise keine Ausgabe erhalten.

Jetzt habe ich versucht, das Problem zu diagnostizieren. Wenn ich einfach renne tail -n1, dann etwas in das Terminal eingebe, wird es nach der ersten Zeile beendet. Wenn ich jedoch Folgendes ausführen:

grep some_text | head -n1 

In diesem Fall erhalte ich keine Ausgabe, bis ich STRG + D drücke, und dann wird die erste Zeile der Eingabe gedruckt some_text.

Meine Frage ist, warum das so ist. Wenn headim ersten Fall die erste Zeile sofort ausgegeben wird, warum nicht, wenn sie die Eingabe von einer Pipe erhält? Sollte es nicht alles für die ersten n Zeilen ausgeben, dann beenden und ein SIGPIPE-Signal an das andere Ende der Pipe senden?

3
Ich bin mir nicht sicher, ob ich das sehr gut verfolge. Erhalten Sie eine Ausgabe, wenn Sie `tail -f log_file | grep some_text` Kirk vor 13 Jahren 0
Ich bekomme nur am Ende des Eingabestroms eine Ausgabe. Wenn ich grep nicht verwende, erhalte ich sofort eine Ausgabe. Wenn ich grep aber keinen Kopf verwende, bekomme ich auch sofort eine Ausgabe. petersohn vor 13 Jahren 0
Mögliches Duplikat: http://superuser.com/questions/275827/how-to-read-one-line-from-tail-f-through-a-pipeline-und-then-terminate peth vor 13 Jahren 0

2 Antworten auf die Frage

2
peth

greppuffert Ihre Eingabe. Versuchen Sie es grep --line-buffered.

Es gibt ein zusätzliches Problem. headWird erst beendet, wenn eine zweite Zeile empfangen wird. Dies kann ein Problem sein, wenn Ihre Protokolldatei eine niedrige Frequenz hat. Siehe So lesen Sie eine Zeile aus tail -feiner Pipeline und beenden sie dann? .

0
Kirk

Wenn Sie tail -n1ohne Eingabe laufen, wird es nach der ersten Eingabezeile von STDIN beendet, so sollte es funktionieren. Wenn Sie laufen grep some_text | head -n1, liefern Sie wieder keine Eingaben an grep, so dass es scheint, dass das Verhalten, das Sie Ihrer Meinung nach beschreiben, normal ist. Wenn Sie STRG D drücken, schließen Sie die STDIN-Pipe und geben aus, head -n1was `grep von STDIN erhalten hat.