我想监视一个文件。所以我使用下面的命令跟踪了一个文件,每行执行一个脚本。
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)
有效。但是,当给定的下一个过滤器一样sed
,grep
,xargs
等它没有借机如下所示的一个。
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)
使用--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)