2017-05-12 6 views
1

Warum funktioniert tail -f nicht gut mit xargs?tail -f (folgen) und xargs

Dieser Befehl funktioniert wie erwartet, ich einen Textblock zu sehen:

tail /var/log/auth.log|xargs echo

Aber dieser Befehl zeigt mir nichts:

tail -f /var/log/auth.log|xargs echo

Beide tail und tail -f Ausgang. Man könnte denken, es Linienbegrenzer, aber Einstellung sowohl auf null hat nicht funktioniert:

tail -z -f /var/log/auth.log|xargs -0 echo

+1

Weil 'tail -f' nicht beendet? – DavidW

Antwort

3

Da tail -f nicht beendet; Es wartet immer noch auf neue Zeilen hinzugefügt werden. Und xargs (es sei denn, Sie verwenden -L oder ähnliches) wartet, bis es "genug" Argumente hat, um es sinnvoll zu machen, die Befehlszeile auszuführen. Wenn Sie den Befehl einmal pro Zeile ausführen möchten, verwenden Sie xargs -L1. Siehe man xargs für Details:

-L max-lines 
     Use at most max-lines nonblank input lines per command line. 
     Trailing blanks cause an input line to be logically continued 
     on the next input line. Implies `-x`. 

Watch out für die "trailing blanks" Verhalten. Sie können das vermeiden, indem -I statt -L1 und die Angabe eines expliziten Austausch Argument:

tail -f /var/log/auth.log | xargs -I {} echo {} 
+0

Irgendeine Idee, warum die -f im Schwanz diesen Befehl bricht? 'tail -fz /var/log/auth.log | egrep -o Fehler | xargs -L1 echo \> '(mit -f gibt es keine Ausgabe). – jcalfee314

+1

@ jcalfee314: Es ist ein sehr ähnliches Problem. 'egrep' puffert seine Ausgabe, so dass es nichts schreibt, bis es" genug "zum Schreiben hat (normalerweise mehrere tausend Zeichen). Sie können 'stdbuf' verwenden, um' grep' zum Zeilenpuffer zu zwingen. Es gibt viele doppelte Fragen zu SO. – rici

+0

@ jcalfee314: Hier ist der erste, den ich mit einer SO-Suche gefunden habe: http://stackoverflow.com/questions/36822898/why-cant-i-filter-tails-output-multiple-times-through-pipes/ – rici

Verwandte Themen