Text-Processing
使用 tail 時將換行符轉換為空分隔符
如何更改輸出
tail
以使用以空字元結尾的行而不是換行符?我的問題與此類似:How to do
head
andtail
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
編輯(因為您在問題中更改為
tail
)tail -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