
正規表現を使用して、コマンド出力から一部のテキストパターンをキャプチャして配列を作成しようとしています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
私にも効果があります。