将多个命令传递给单个命令,没有EOF信号等待

时间:2012-11-02 12:29:32

标签: bash shell grep pipe

如何将std-out多个命令传递给单个命令?类似的东西:

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

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

3 个答案:

答案 0 :(得分:8)

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

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

需要在结束括号前的分号。

答案 1 :(得分:1)

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

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

魔术位是cat的 - 参数;它告诉cat接受stdin并将其添加到要连接的输入列表(其他的,在本例中为logfiles)。

答案 2 :(得分: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