中断されたコマンドの出力キャプチャ

中断されたコマンドの出力キャプチャ

正規表現を使用して、コマンド出力から一部のテキストパターンをキャプチャして配列を作成しようとしていますlist_mqs。問題は、前のコマンドが中断され、決して終了しないことです。したがって、aを使用すると、他のルーチンが完了しないため、pipeline | egrepコマンドは開始されません。egrep

私が捉えたいパターンは MQ_1A、、、MQ_F5ですMQ_H7

[user@host] list_mqs=($(command_never_ends | egrep -io "MQ_*"))

前のコマンドが終了しなくても(または終了に達したときにカウンタを設定しても)、前のコマンドの出力をリダイレクトし、その内容をルーチン分析のために渡す方法はありますかegrep

ベストアンサー1

コマンド/アプリケーションをパイプしたが、コマンド/アプリケーションが出力を表示しない場合buffer

パイプを介して出力を取得する2つのソリューション(より多くのソリューションがあると思います)があります。

解決策1:使用unbuffer

unbuffer command_never_ends | egrep -io "MQ_*"
#Or if the 'command_never_ends' does really finish:
list_mqs=("$(unbuffer command_never_ends | egrep -io "MQ_*")")

解決策2:使用named pipes

#Create the named pipe
mkfifo pipe1
#Redirecting 'command_never_ends' output (stdout,stderr) to named pipe
command_never_ends &> pipe1

これを使用すると、command_never_ends &> pipe1名前付きパイプが表示されるまでプログラムは起動しません。パイプ1読んだ。さて、次のようにする必要があります。

#Reading line per line the output of 'command_never_ends'
while read -r line; do 
   egrep -io "MQ_*" <<< "$line"
done < pipe0

あなたは見ることができます私の答えJavaアプリケーションを使用してパイプにデータを送信する名前付きパイプについて説明します。

ノート
コマンドを試してみましたが、うまくstdbufいかないようです。私はこれを知っていstdbufて、unbuffer別の方法で働いています。これを達成するためにそれを使用する方法を知っている人がいればstdbuf私にも効果があります。

おすすめ記事