3

如何将多个命令的标准输出通过管道传输到单个命令?就像是:

(cat my_program/logs/log.*;tail -0f my_program/logs/log.0) | grep "filtered lines"

我想使用管道在单个命令行上运行以下所有命令,并且不重定向到临时文件(如果可能)。有一个细微差别意味着我不能使用括号;我希望最后一个命令是尾馈,所以我希望 grep 在 std-in 接收到每一行之后发生 - 而不是等待 EOF 信号。

4

3 回答 3

8

尝试使用当前 shell 而不是子 shell:

{ cat file1; tail -f file2; } | grep something

右大括号前的分号是必需的。

于 2012-11-02T20:47:10.213 回答
1

如果命令不必并行执行,则可以使用 cat 将输出统一为单个连续流,如下所示:

tail -0f log.0 | cat - log.* | grep "filtered lines"

魔术位是cat的-参数;它告诉 cat 获取标准输入并将其添加到要连接的输入列表(在这种情况下,其他输入是日志文件)。

于 2012-11-02T12:42:23.553 回答
0

好的,我有一个混乱的解决方案(它是一个脚本 - 遗憾的是这对于命令行来说是不切实际的):

#!/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
于 2012-11-05T17:09:21.320 回答