
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
答え1
最後の 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
。
1xargs -d '\n'
つは動作しますが、他の場合はバッファリングの問題が発生します。
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
出力がターミナル (ここではパイプ) に送信されない場合、出力をバッファリングします。つまり、書き込むデータがバッファ一杯 (8kiB 程度) 蓄積されるまで、何も書き込まれません。つまり、myCmd
バッチで呼び出されることになります。
GNU または FreeBSD システムでは、tr
次のstdbuf
コマンドを使用してバッファリングの動作を変更できます。
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2