Text-Processing

使用 tail 時將換行符轉換為空分隔符

  • May 31, 2017

如何更改輸出tail以使用以空字元結尾的行而不是換行符?

我的問題與此類似:How to do head and tail on null-delimited input in bash? ,但不同之處在於我想做類似的事情:

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

如果你想要最後 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'會起作用,但對於其他的,你會遇到緩衝問題。在:

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

引用自:https://unix.stackexchange.com/questions/121916