tail
改行の代わりにnullで終わる行を使用するように出力をどのように変更できますか?
私の問題は次のようなものです。bashでnullで区切られた入力で「頭」と「尾」を実行する方法は?しかし、違いは、次のような作業をしたいということです。
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
NULで区切られた最後の10個のレコードが必要な場合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
。
1つはxargs -d '\n'
機能しますが、もう1つはバッファリングの問題です。存在する:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
端末(ここではパイプ)に到達できないときに出力をバッファリングします。 IEでは、書き込むデータのフルバッファ(約8kiB)が蓄積されるまで何も書きません。これはmyCmd
一括して呼び出されることを意味します。
tr
GNUまたはFreeBSDシステムでは、次のコマンドを使用してバッファリング動作を変更できますstdbuf
。
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2