テールを使用する場合、改行をヌル区切りに変換します


20

tail改行の代わりにヌル終了行を使用するように出力を変更するにはどうすればよいですか?

私の質問はこれに似ています:bashのnull区切りの入力で「head」と「tail」を行う方法は?、しかし、私は次のようなことをしたいという点で異なります:

tail -f myFile.txt | xargs -i0 myCmd {} "arg1" "arg2"

find使用していないため、使用できません-print0

これはすべて、xargsで発生するエラーを回避するためです。

xargs: unmatched double quote;
    by default quotes are special to xargs unless you use the -0 option

回答:


26

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

編集(質問のtailtail -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

実際には、末尾に-fオプションを使用することを意図していました。このオプションは、行が入ってくると継続的に印刷します。-fオプションを使用すると、ソリューションは機能しません。
ラース14年

動作するtail -f myFile.txt | xargs -r0i -d '\n' myCmd "{}" "||" "||"ようです!ありがとう。
ラース14年

@Lars、申し訳ありませんが、-iオプションはオプションの引数を取るため、-i0動作しません。tail -f最後のもの以外はすべて動作するはずですが、バッファリングのため、xargsから入力を取得するまでに遅延があることに注意してくださいtr。これを変更するには、のstdbuf -o0 tr '\n' '\0'代わりに実行しますtr '\n' '\0'
ステファンシャゼル14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.