如果要最后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
。
该xargs -d '\n'
一会工夫,但对于其他的人,你就会有一个缓冲的问题。在:
tail -f myFile.txt | tr '\n' '\0' | xargs -r0i myCmd {} arg1 arg2
tr
当它没有到达终端(这里是管道)时,缓冲其输出。IE,它将不会写任何东西,直到它已经积累了一个充满了要写入数据的缓冲区(类似于8kiB)。这意味着myCmd
将被批量调用。
在GNU或FreeBSD系统上,您可以tr
使用以下stdbuf
命令更改的缓冲行为:
tail -f myFile.txt | stdbuf -o0 tr '\n' '\0' |
xargs -r0i myCmd {} arg1 arg2