最後の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