シェルスクリプトからパイプライン出力のリストを読み、特定の項目を探しています。正確な名前はわかりませんが、その中にある単語は知っています。それを見つけるためにアイテムに表示されることを知っている各単語に複数のgrepを使用します。
pw-cli list-objects | grep node.name | grep output | grep pci | grep analog
これを行うための他のオプションはありますか?ありがとうございます。
答え1
私はこれにawkを使います:
pw-cli list-objects | awk '/node\.name/ && /output/ && /pci/ && /analog/'
あるいは、Perlの正規表現構文、または他のPerl言語機能またはライブラリモジュールが必要な場合は、Perlを使用することもできます(この例では実際には必要ありません)。
pw-cli list-objects |
perl -n -e 'print if (/node\.name/ && /output/ && /pci/ && /analog/)'
これを行うには、awkまたはPerlを使用すると、2つの主な利点があります。
入力ワードの順序に関係なく、入力行と一致します。つまり、
node\.name.*output.*pci.*analog
この正規表現は、その単語が入力行にある場合にのみ一致します。正確にその注文。上記のawkまたはperlの1行ステートメントは、4つの単語がすべて任意の順序で入力行に表示された場合に一致します。これはgrep
、パイプラインで複数のsを一緒に接続する方法と同じです。あなたできる各位置の変更に replacement() と一緒に拡張正規表現を使用し
|
ますが、4 つの単語の場合、可能なすべての置換を一致させるには 16 の代替バージョンが必要なので、これは実用的ではありません。(a.*b.*c.*d)|(a.*c.*b.*d)|(a.*b.*d.*c)|.........
&&
||
(AND)、(OR)、(否定)、および括弧の組み合わせを使用して、!
任意に複雑なブール条件を設定できます。 trueまたはfalseの結果を返す他のawkまたはperl構文と組み合わせて使用することもできます(たとえば、入力行のフィールドに基づいて計算および比較)。
答え2
はい、「正規表現」を使用してください。読むman grep
。
# if they're on the same linr
pw-cli | grep 'node\.name.*output.*pci.*analog'
# or if they're not
pw-cli | grep 'node\.name|output<pci|analog'