grepと論理演算子

grepと論理演算子

論理演算子を使用してgrep検索を実行できるgrep様のユーティリティはありますか?論理構造を自由に入れ子にして結合できるようにしたいです。たとえば、次のことが可能です。

grep (term1 && term2) || (term1 && (term3 xor term4)) *

一般的なgrepと追加のbashスクリプトを使用してこれを行うことができることを知っていますが、私の目標はこれを防ぐことです。

答え1

grep論理演算子の使用方法はいくつかあります。

  1. -e指定されたパターンに一致するものを一致させるには、複数のオプションを使用します。または仕事。

    例:grep -e pattern1 -e pattern2 filename

  2. 拡張正規表現(grep -E)では、次のように複数の|パターンを組み合わせることができます。または仕事。

    例: grep -E 'pattern1|pattern2' filename

  3. grep -vシミュレーション可能いいえ仕事。

  4. いいえそしての演算子grepですが、無差別代入シミュレーションが可能です。そして|.

    例:grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    上記の例は、両方を含むすべての行と一致します。 モード1そしてモード2どの順序でも。結合するパターンが多いと本当に醜くなることがあります。

答え2

Use はawkusing と同様にperl用語を囲む必要があります//が、次のようにすることができます。

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

これはxor()非標準のGNU拡張であり、xor論理的ではなくビット単位です。/regex/0または1のみ返すので大丈夫です。

otherを使用すると、awk論理をxor()関数として定義できます。

function xor(a, b) {
  return (a || b && ! (a && b))
}

または

function xor(a, b) {
  return ((a && !b) || (b && !a))
}

答え3

パールが利用可能です:

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

どこスイッチ以下に示すように:

-w turns on warnings
-n runs perl against each line of input (looping)
-e executes perl passed in the command line

答え4

grep論理ANDを実装するにはchainコマンドを使用します。

grep expr1 filename | grep expr2

私はそれが非常にシンプルでUnixに似ており、エレガントだと思います。


-Eその後、@Tushiが徹底的に説明したように、OR-ingと-v否定オプションを組み合わせることができます。

あなたの具体的な例は、非常に迷惑でより強力なユーティリティの利点を享受することができます(@muruの答えを参照)。

関連情報