論理演算子を使用したgrep


19

論理演算子を使用してgrep検索を実行できるようにするgrepのようなユーティリティはありますか。論理構造を自由にネストおよび結合できるようにしたいと考えています。たとえば、次のようなものが可能です。

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

これはバニラのgrepと追加のbashスクリプトを使用して実行できることを理解していますが、ここでの目標はそれを回避することです。

grep 

回答:


12

ではawk、と同様にperl、で用語をラップする必要がありますが、次のようにする//ことができます。

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

28

grep論理演算子を使用する方法はたくさんあります。

  1. OR条件の\|複数のパターンを区切るために使用 します。

    例: grep 'pattern1\|pattern2' filename

  2. この-Eオプションを使用して、OR 条件の複数のパターンを送信します。

    例: grep -E 'pattern1|pattern2' filename

  3. -e1つのパターンを使用すると1つのパターンのみが-e一致しますが、複数のオプションを使用すると複数のパターンと 一致します。

    例: grep -e pattern1 -e pattern2 filename

  4. grep -vNOT操作をシミュレートできます。

  5. にはAND演算子はありませgrepんが、オプションを使用して、ブルートフォースでANDをシミュレート-Eできます。

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

    上記の例は、pattern1pattern2の両方をどちらかの順序で含むすべての行 と一致します。


1
-E&&順序に敏感であるという事実のために完全に同等ではありません
-iruvar

grep foo | grep barANDを行うより一般的な方法です。
ケンスター

2
実際の「AND」演算子は存在せず、OR構造を使用してハックをシミュレートすることが最善であると明確に説明した+1。もちろん、これは3つ以上の用語では扱いにくくなりますが、2つの用語ではうまく機能します。
エリックヘッペルレ-CodeSlayer2010

grep -c -e MATCH1 -e MATCH2は、ファイル名のカウントに関心がある場合に最適です。
アンドレジュ

4

perlを使用できます。

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

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

私はそれがあなたがやろうとしていることを達成すると信じています。これは、d出力と一致しない任意の行からeletes term1それは、bスクリプトのうち牧場(およびautoprintsので)任意の行ことに変わりはないし、その試合term2、それが一致しないいずれかを削除したままライン用term3と試合を行うものいずれかからterm4

sed スクリプトは順番に評価され、すべてのテストはブール値であるため、テストから生じるアクションは、後続のアクションの動作に直接影響します。


0

grep論理ANDを達成するためにコマンドをチェーンするために使用します。

grep expr1 filename | grep expr2

Unix風でエレガントな、非常に単純なものだと思います。


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

あなたの特定の例はかなり厄介であり、おそらくより強力なユーティリティの恩恵を受けるでしょう(@muruの答えを参照)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.