複数のgrepの代替

複数のgrepの代替

シェルスクリプトからパイプライン出力のリストを読み、特定の項目を探しています。正確な名前はわかりませんが、その中にある単語は知っています。それを見つけるためにアイテムに表示されることを知っている各単語に複数の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つの主な利点があります。

  1. 入力ワードの順序に関係なく、入力行と一致します。つまり、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)|.........

  2. &&||(AND)、(OR)、(否定)、および括弧の組み合わせを使用して、!任意に複雑なブール条件を設定できます。 trueまたはfalseの結果を返す他のawkまたはperl構文と組み合わせて使用​​することもできます(たとえば、入力行のフィールドに基づいて計算および比較)。

おすすめ記事