2016-04-10 11 views
4

Ich möchte ein Programm die neuesten Zeilen aus einer Textdatei mit Schwanz als Stdin senden.Tail-Ausgabe in ein Programm umleiten

Als Erstes stimme ich dem Programm einige Eingaben zu, die jedes Mal gleich sind, und sende dann die Endeingabe von einer Eingabedatei ein, die zuerst durch sed verarbeitet werden soll. Das Folgende ist die Befehlszeile, von der ich erwarte, dass sie funktioniert. Aber wenn das Programm läuft, empfängt es nur die Echoeingabe, nicht die Tail-Eingabe.

(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program 

, jedoch folgende Arbeiten genau wie erwartet, den Druck alles aus zum Terminal:

echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat 

Also habe ich versucht, mit einer anderen Art von Ausgang und wieder, während der wiederholte Text geschrieben, den Schwanz Text nicht überall angezeigt:

(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') | tee out.txt 

das machte mir denken, dass es ein Problem mit Pufferung ist, aber ich versuchte, das unbuffer Programm und alle anderen Ratschläge hier (012.351.) ohne Ergebnisse. Wohin geht die Tail-Ausgabe und wie kann ich sie wie erwartet in mein Programm bringen?

+0

Sind Sie sicher, dass sed etwas druckt? '-n' deaktiviert das Drucken des Musterbereichs, so dass die einzige Ausgabe von diesem Befehl das ist, was Sie explizit mit' p' drucken. (Ich denke ... ich mache nicht viel mit sed.) Versuchen Sie 'cat ~/inputfile | sed -n -r 'regex' und sieh nach, ob etwas gedruckt wird. Wenn nicht, dann weißt du warum! –

+1

In deinen ersten beiden Beispielen glaube ich nicht, dass 'cat' jemals ausgeführt wird. In allen Beispielen führt die Shell 'echo' aus (was erfolgreich ist), also geht es weiter zum zweiten Befehl, dem Pipeline-Tail | sed'. Aber "tail -f" endet nie - es wartet nur auf weitere Daten, die am Ende von ~ ~/inputfile erscheinen.'sed' kann die Ausgabe puffern (oder es gibt überhaupt keine Ausgabe), aber bis' tail' beendet wird, wird 'sed' nicht beendet und entweder beendet. Und bis 'Schwanz | sed 'exits,' cat' wird nicht ausgeführt. (Ich glaube nicht, dass du wirklich 'Katze' brauchst, wirklich.) Hängt ein anderer Prozess an '~/inputfile'? –

+0

@DaveM. yes sed druckt eine einzelne Erfassungsgruppe mit dieser Kombination. Ich kann versichern, dass es funktioniert und etwas druckt. Du hast Recht, dass Cat nicht ausgeführt wird, obwohl das Entfernen nichts ändert - das Pipe funktioniert immer noch nicht. Ja, ein anderer Prozess hängt an ~/Eingabedatei und ich möchte einen Teil dieser Ausgabe an mein Programm senden. – Laurence

Antwort

1

Das Puffer Problem wurde gelöst, als ich den sed Befehl mit dem Präfix das Folgende:

stdbuf -i0 -o0 -e0 

Viel mehr vorzuziehen, mit unbuffer, die nicht einmal für mich arbeiten. Dave Ms Vorschlag, seds relativ neues -u zu verwenden, scheint auch den Trick zu machen.

0

Sie können den i Befehl in sed (die Befehlsliste in der Manpage für Details) das Einfügen am Anfang zu tun:

tail -f inputfile | sed -e '1inew file' -e 's/this/that/' | ./program 
+0

Ich bin mir nicht sicher, was genau du hier empfiehlst. Ich habe versucht, den 'i' Befehl ohne zusätzlichen Erfolg hinzuzufügen. – Laurence

1

Eine Sache, die Sie möglicherweise verwirrt bekommen - | (Pipeline) ist höhere Priorität als && (fortlaufende Ausführung). Also, wenn Sie sagen

(echo "new" && tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex' && cat) | ./program 

, das entspricht

(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -r 'some regex') && cat) | ./program 

so die cat nicht wirklich etwas zu tun, und die sed Ausgang wird wahrscheinlich ein wenig gepuffert. Sie können mit der -u Option sed versuchen, es zu bekommen ungepufferten Ausgang zu verwenden:

(echo "new" && (tail -f ~/inputfile 2> /dev/null | sed -n -u -r 'some regex')) | ./program 

Ich glaube, einige Versionen von sed Standard -u, wenn der Ausgang ein Terminal ist und nicht, wenn es sich um ein Rohr ist, so dass kann sei die Quelle des Unterschieds, den du siehst.

+0

Die Verwendung von' & cat' statt '&& cat' gab mir das Ergebnis, das ich suchte: die Fähigkeit zu simulieren gleichzeitig die Eingabe in ein Programm und interagieren mit ihm über die Tastatur. – Laurence

+0

'& cat' bedeutet, dass die vorherige Pipeline (tail | sed) im Hintergrund ausgeführt wird, während' cat' im Vordergrund läuft - ganz anders als '&&' –

Verwandte Themen