尾を使用する場合、改行を空の区切り文字に変換する

尾を使用する場合、改行を空の区切り文字に変換する

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これは、ファイルを完全に読み取る必要があることを意味します。\0tail

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一括して呼び出されることを意味します。

trGNUまたはFreeBSDシステムでは、次のコマンドを使用してバッファリング動作を変更できますstdbuf

tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
  xargs -r0i myCmd {} arg1 arg2

おすすめ記事