最後の10行が必要な場合:
tail myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
ただし、GNU xargsでは、次のように区切り文字を改行に設定することもできます。
tail myFile.txt | xargs -ri -d '\n' myCmd {} arg1 arg2
(-0は)の略です-d '\0'。
移植可能であれば、すべての文字を単純にエスケープすることもできます。
tail myFile.txt | sed 's/./\\&/g' | xargs -I{} myCmd {} arg1 arg2
または、各行を引用します:
tail myFile.txt | sed 's/"/"\\""/g;s/.*/"&"/' | xargs -I{} myCmd {} arg1 arg2
あなたは10最後のNULで区切られたレコードをしたい場合myFile.txt(ただし、そのテキストファイルではないでしょう)、あなたは変換する必要があるだろう\nに\0呼び出す前に、tailファイルが完全に読み込まれる必要がありますを意味します。
tr '\n\0' '\0\n' < myFile.txt |
tail |
tr '\n\0' '\0\n' |
xargs -r0i myCmd {} arg1 arg2
編集(質問のtailをtail -fに変更したため):
上記の最後のものは明らかに意味がありませんtail -f。
xargs -d '\n'1は動作しますが、他のもののために、あなたはバッファリングの問題があるでしょう。に:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
trターミナル(ここではパイプ)に行かないときに、出力をバッファリングします。IE、それは書き込むためのデータの完全なバッファ(8kiBのようなもの)を蓄積するまで何も書き込みません。つまりmyCmd、バッチで呼び出されます。
GNUまたはFreeBSDシステムでtrは、stdbuf次のコマンドでバッファリング動作を変更できます。
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2