手続き型置換の出力を変数としてパイプ

手続き型置換の出力を変数としてパイプ

非常に複雑な命令セットがあります。

command | ... | ... | tee >(grep -c '[^3]$') >(grep -c '[^35]$') 1>/dev/null

出力が非常に大きいため、出力を保存するための一時ファイルを使用したくありません。私は>(grep -c '[^3]$' | read variable)これを試しましたが、>(grep -c '[^3]$' | read variable2)プロセスの置き換えのためにサブシェルビットが機能しないようです。

出力を複数の変数に直接パイプするにはどうすればよいですか?可能ですか?

今、次の回避策があります。

var=$(command ... | ... | ... | tee >(grep -c '[^3]$') >(grep -c '[^35]$') 1>/dev/null)
var1=$(tail -1 <<< $var)
var2=$(head -1 <<< $var)

でも、私の考えには這い、見に良くないと思います。私は他のファイルをgrepできることを知っていますが、それも好きではありません。

よろしくお願いします。

ベストアンサー1

両方のgrepプロセスを置き換えるには、-ingawkの代わりに使用します。teeたとえば、

command | ... | ... | awk '
     /[^3]$/  { c1++; next };
     /[^35]$/ { c2++; next };
     END { print c1, c2 > counts.txt }'

read var1 var2 < counts.txt
rm counts.txt

一時ファイルを使用したくない場合は、次のようにします。

read var1 var2 < <(command | ... | ... | awk '
         /[^3]$/  { c1++; next };
         /[^35]$/ { c2++; next };
         END { print c1, c2 }')

おすすめ記事