Xargs

為什麼 xargs 不能與 tail -f 一起使用?

  • December 19, 2018

我想要tail -f /var/log/syslog | grep模式“arpwatch”並通過jabber將每一行發送給自己:xmpp username@jabber.server使用xargs

tail -f /var/log/syslog | grep arpwatch | xargs sendxmpp username@jabber.server

不工作。

tail /var/log/syslog | grep arpwatch | sendxmpp username@jabber.server

效果很好。

我認為這是一些基本的事情xargstail -f我不明白。

xargs *command*嘗試在一次命令呼叫中收集盡可能多的輸入項(行、單詞) ,並且它並不特別關心輸入數據的時間。如果tail程序被殺死,或者xargs緩衝區被填滿,它將使用它收到的參數執行命令。但是,tail -f通常不會自行完成,並且命令行參數的限制可能很大,所以它似乎根本不起作用。

您可以使用xargs -n1它一次只將一個輸入項傳遞給commandxargs ,但是您會被使用空格將輸入拆分為項的事實所打擊,因此輸入行foo bar會導致命令執行兩次。

使用 GNU xargs,xargs -n1 -d '\n'應該做你想做的事:為每個輸入行執行一次命令,將整行作為單個參數傳遞。

嘗試,例如有和沒有-dand-n並記下輸出時間:

$ ( echo "123 456"; sleep 1; echo foo; sleep 1; echo doo ) | xargs -d '\n' -n1 printf ':%s\n'

xargs -L 1也可以,但它仍會將行拆分為單獨的參數,而不是將整行作為一個參數傳遞。

引用自:https://unix.stackexchange.com/questions/489926