将 tail -f 与 sed 和 xargs 一起使用

将 tail -f 与 sed 和 xargs 一起使用

/tmp/test假设我有以下过程每秒向文件写入一个数字+单引号:

for i in {1..1000} ; do echo $i\' ; sleep 1 ; done > /tmp/test

然后我想tail -f通过另一个函数使用和运行它。出于测试目的,我正在使用echo

tail -f /tmp/test | xargs echo

这给了我以下错误(在输入中不带引号运行它可以正常工作):

xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option

如果我将 sed 添加到等式中,我根本不会得到任何输出:

tail -f /tmp/test | sed "s/['\"]//g" | xargs echo

有什么想法为什么我在添加后没有得到输出sed,或者如何在输入之前从输入中删除引号xargs

答案1

有很多事情。

首先:“tail -f”永远不会完成,因此“xargs”同样会无限期地保持运行。您可以打开第二个窗口来“kill -HUP”“tail -f”进程,以使“tail -f”和“xargs”完成,从而产生输出。

其次:“xargs”正在缓冲输入,并且没有获得它认为的“完整缓冲区”,因此当输出 1000 秒标记时,它甚至还没有运行一次 echo 命令。如果您希望“xargs”为每个输入行单独运行 echo,则需要向 xargs 添加“-n 1”选项。

至于“xargs”不喜欢单引号,您可以使用选项“-d '\n'”来禁用引号处理,并且仅用换行符分隔输入参数。

答案2

或许

tail -f /tmp/test | sed "s/['\"]//g" | while read line; do
  do_something "$line"
done

并检查一下:https://stackoverflow.com/questions/199266/make-xargs-execute-the-command-once-for-each-line-of-input

相关内容