論理演算子を使った 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

の場合awk、 の場合と同様にperl、項を で囲む必要があります//が、次のように実行できます。

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

xor()非標準の GNU 拡張である which はビット単位のものであり、論理的なものではないことに注意してください。これらは0 または 1 のみを返すxorので、ここでは問題ありません。/regex/

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

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

または

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

答え3

perl を使うこともできます:

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 を実現するためにコマンドを連鎖させます。

grep expr1 filename | grep expr2

非常にわかりやすく、Unix ライクでエレガントだと思います。


次に、(@Tushi が詳しく説明したように)-EOR 演算と-v否定演算のオプションを組み合わせることができます。

あなたの特定の例はかなり厄介なので、おそらくもっと強力なユーティリティを使うと良いでしょう(@muru の回答を参照)。

関連情報