3

複数のコマンドの std-out を 1 つのコマンドにパイプするにはどうすればよいですか? 何かのようなもの:

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

パイプを使用して単一のコマンドラインで次のすべてのコマンドを実行し、一時ファイルへのリダイレクトを使用したくない (可能な場合)。括弧を使用できないことを意味する小さなニュアンスが 1 つあります。最後のコマンドをテールフィードにしたいので、すべての行がstd-inによって受信された後にgrepが発生するようにします-EOFシグナルを待ちません。

4

3 に答える 3

8

サブシェルの代わりに現在のシェルを使用してみてください。

{ 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 に stdin を取り、それを入力のリスト (この場合はログファイル) に追加して連結するように指示します。

于 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 メソッドを使用しており、grep が EOF シグナルで終了するのを止めるために while ループを使用する必要もありました。

while [[ -p /tmp/logfifo ]]

FIFO を削除するためのトラップも含めました。

trap OnExit SIGINT SIGTERM
于 2012-11-05T17:09:21.320 に答える