grep 不起作用后的管道命令

AVJ*_*AVJ 3 grep buffer

我想监视一个文件。所以我使用下面的命令跟踪了一个文件,每行执行一个脚本。

tail -3f logfile.log | grep "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh
Run Code Online (Sandbox Code Playgroud)

但似乎脚本没有被执行。我观察到grep没有为下一个管道提供任何输入。

当我尝试时,

tail -3f logfile.log | grep "action.*add"
Run Code Online (Sandbox Code Playgroud)

有效。但是,当给定的下一个过滤器一样sedgrepxargs等它没有借机如下所示的一个。

tail -3f /var/tmp/rabbitmq-tracing/logfile.log | grep "action.*add" | grep add 
Run Code Online (Sandbox Code Playgroud)

请帮助我了解为什么会发生这种情况以及如何克服这种情况。


编辑 1: 基本上像下面这样的东西应该可以工作,并且以前可以工作。困惑为什么它现在不起作用。

tail -f file.txt | grep something | grep something | grep something
Run Code Online (Sandbox Code Playgroud)

编辑 2: 第一个 grep 之后的输出行将是一个 json 字符串,如下所示。我想将此行作为输入(用单引号括起来)给 bash 脚本。

{"twNotif": {"originator": "api", "chain": "test", "txId": "08640-0050568a5514", "version": "1.0", "msgType": "api", "twData": {"api": {"hostId": "007bdcc5", "user": "test", "cmdTxt": "100599"}}, "action": "add", "store": "test", "msgTime": 1467280648.971042}}
Run Code Online (Sandbox Code Playgroud)

Bab*_*aba 8

使用--line-buffered开关grep

tail -3f logfile.log | grep --line-buffered "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh
Run Code Online (Sandbox Code Playgroud)

来自男人 grep:

--line-buffered 在输出上使用行缓冲。这可能会导致性能损失。


或者你可以使用stdbuf 阅读更多

stdbuf 允许修改与程序关联的三个标准 I/O 流的缓冲操作。概要:

使用这个语法:

... | stdbuf -oL grep ... | ...
Run Code Online (Sandbox Code Playgroud)

你的例子:

tail -3f logfile.log | stdbuf -oL grep "action.*add" | sed -u -e "s/^/'/" -e "s/$/'/" | xargs -L 1 -P 5 bash testscript.sh
Run Code Online (Sandbox Code Playgroud)