
論理演算子を使用して 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
の場合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 が詳しく説明したように)-E
OR 演算と-v
否定演算のオプションを組み合わせることができます。
あなたの特定の例はかなり厄介なので、おそらくもっと強力なユーティリティを使うと良いでしょう(@muru の回答を参照)。