如何将多个命令的标准输出通过管道传输到单个命令?就像是:
(cat my_program/logs/log.*;tail -0f my_program/logs/log.0) | grep "filtered lines"
我想使用管道在单个命令行上运行以下所有命令,并且不重定向到临时文件(如果可能)。有一个细微差别意味着我不能使用括号;我希望最后一个命令是尾馈,所以我希望 grep 在 std-in 接收到每一行之后发生 - 而不是等待 EOF 信号。
尝试使用当前 shell 而不是子 shell:
{ cat file1; tail -f file2; } | grep something
右大括号前的分号是必需的。
如果命令不必并行执行,则可以使用 cat 将输出统一为单个连续流,如下所示:
tail -0f log.0 | cat - log.* | grep "filtered lines"
魔术位是cat的-参数;它告诉 cat 获取标准输入并将其添加到要连接的输入列表(在这种情况下,其他输入是日志文件)。
好的,我有一个混乱的解决方案(它是一个脚本 - 遗憾的是这对于命令行来说是不切实际的):
#!/bin/bash
ProcessFIFO(){
while [[ -p /tmp/logfifo ]]; do
grep "filtered lines" < /tmp/logfifo
done
}
OnExit(){
rm -f /tmp/logfifo
echo 'temp files deleted'
exit
}
# Create FIFO
mkfifo /tmp/logfifo
trap OnExit SIGINT SIGTERM
ProcessFIFO &
cat log.* > /tmp/logfifo
tail -0f log.0 > /tmp/logfifo
我已经习惯了@itsbruce 建议的 FIFO 方法,而且我还不得不使用 while 循环来阻止 grep 在 EOF 信号处结束:
while [[ -p /tmp/logfifo ]]
我还包括一个删除 FIFO 的陷阱:
trap OnExit SIGINT SIGTERM