
論理演算子を使用してgrep検索を実行できるgrep様のユーティリティはありますか?論理構造を自由に入れ子にして結合できるようにしたいです。たとえば、次のことが可能です。
grep (term1 && term2) || (term1 && (term3 xor term4)) *
一般的なgrepと追加のbashスクリプトを使用してこれを行うことができることを知っていますが、私の目標はこれを防ぐことです。
答え1
grep
論理演算子の使用方法はいくつかあります。
-e
指定されたパターンに一致するものを一致させるには、複数のオプションを使用します。または仕事。例:
grep -e pattern1 -e pattern2 filename
拡張正規表現(
grep -E
)では、次のように複数の|
パターンを組み合わせることができます。または仕事。例:
grep -E 'pattern1|pattern2' filename
grep -v
シミュレーション可能いいえ仕事。いいえそしての演算子
grep
ですが、無差別代入シミュレーションが可能です。そして|
.例:
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
上記の例は、両方を含むすべての行と一致します。 モード1そしてモード2どの順序でも。結合するパターンが多いと本当に醜くなることがあります。
答え2
Use はawk
using と同様に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の答えを参照)。