Ich möchte tail -f /var/log/syslog | grep
es mit dem Muster „arpwatch“ und sende jede Zeile per Jabber an mich selbst:xmpp [email protected]
Verwenden von xargs
tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp [email protected]
funktioniert nicht.
aber tail /var/log/syslog | grep arpwatch | sendxmpp [email protected]
funktioniert gut.
Ich denke, es ist eine grundlegende Sache bei xargs
und tail -f
das verstehe ich nicht.
Akzeptierte Antwort:
xargs command
versucht, so viele Eingabeelemente (Zeilen, Wörter) wie möglich zu einem Aufruf des Befehls zu sammeln , und es kümmert sich nicht besonders um das Timing der Eingabedaten. Wenn der tail
Prozess wird beendet oder xargs
s-Puffer gefüllt wird, wird Befehl ausgeführt mit den bis dahin erhaltenen Argumenten. Allerdings tail -f
beendet sich normalerweise nicht von selbst, und das Limit für Befehlszeilenargumente kann groß sein, sodass es den Anschein hat, als würde es überhaupt nicht funktionieren.
Sie könnten xargs -n1
verwenden nur ein Eingabeelement auf einmal an Befehl übergeben , aber Sie werden von der Tatsache getroffen, dass xargs
verwendet Leerzeichen, um die Eingabe in Elemente aufzuteilen, also eine Eingabezeile von foo bar
würde dazu führen, dass der Befehl zweimal ausgeführt wird.
Mit GNU xargs, xargs -n1 -d '\n'
sollte tun, was Sie wollen:Führen Sie Befehl aus einmal für jede Eingabezeile, wobei die vollständige Zeile als einzelnes Argument übergeben wird.
Versuchen Sie z. mit und ohne -d
und -n
und notieren Sie sich das Ausgabetiming:
$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'
xargs -L 1
würde auch funktionieren, aber es wird die Zeile immer noch in separate Argumente aufteilen, anstatt die ganze Zeile als ein Argument zu übergeben.