複数のコマンドでパイプを個別に解析する方法は?


2

各ステップで切り捨てることなく、複数のコマンドで単一のコマンドの出力を解析するにはどうすればよいですか?

たとえば、 ls -al|grep -i something「何か」を含むすべての行を次のパイプに渡しますが、条件に一致しないため、パイプ内の他のすべての行が破棄されます。私が欲しいのは、多くのコマンドで独立して単一のパイプで操作できるようにすることです。

この場合、メッセージ本文全体を渡すMuttからのパイプです。これらのそれぞれを多分bash変数にgrep、sed、delete、および割り当てたいです。

最初に必要なのは、変数に「メッセージID」を割り当て、別の変数に「サブジェクト」を割り当てることができるようにすることです。その後、それらを適切なコマンド引数に渡します。

これがどうなるか

MessageBodyFromMutt|grep something -Ax -Bx |grep another thing from the original message| sed some stuff from the original message| cut from here to there

明らかに、上記の行は私が望むことをしません。

これらすべてのコマンドが元のメッセージ本文で動作するようにします。理にかなっているといいのですが


試してくださいtee。パイプをフォークします(ただし、変数ではありません)。
チョロバ

チョラバ、ありがとう。それは私が必要なもののようですが、Muttはteeに続くコマンドの括弧を好みません。私はいくつかのチェーンをテストし、bashで動作しますが、Mutt pipeはそのような問題について不平を言っています。何かお勧め?
yarunは

Muttはおそらく実行されてshbashますが、ではありません。bashを実行するように構成できますか?または実行しbash -c '...'ます。
チョロバ

@chorobaわかりました。これが私がやろうとしていることです。「タスクの追加+送信者の電子メールの送信元+」というコマンドがあるので、これを分割しようとしています。「+」はtaskwarriorのタグです。Teeが私にそれをさせてくれると思いますか?私はそれらを貝殻に割り当てることができると考えていましたが、それはティーでは起こらないようです。
ヤルンは

オリジナルをgrepし、オリジナルをsedしたい場合。cat original | grep <ENTER> catオリジナル| sed <ENTER>などgrepおよびsedを使用して、開始するデータの例と終了するデータの例を指定すると、より明確になります。
barlop

回答:


2

出力を一時ファイルに保存し、そのファイルを個々のコマンドの入力として使用できます。
コマンドに出力がない場合はteebashプロセス置換で使用できます。それは次のようになります

MessageBodyFromMutt | tee >( command1 ) >( command2 ) >( command3 )

ただし、出力が混在しているため、ここでは役に立ちません-コマンドを変更して出力をファイルに保存する場合を除きます。

一時ファイルを作成できない場合は、処理する出力を変数に複数回保存してから、echoそれを複数回保存できます。

messageBody="$( MessageBodyFromMutt )"
echo "$messageBody" | command1
echo "$messageBody" | command2
echo "$messageBody" | command3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.