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. 沒有運算符 in grep,但您可以暴力模擬透過使用多種模式與|.

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

    上面的範例將匹配包含兩者的所有行 模式1模式2以任一順序。如果有更多的模式需要組合,這會變得非常難看。

答案2

使用awk,與使用 一樣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:

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命令來實現邏輯與:

grep expr1 filename | grep expr2

我相信它非常簡單、類似 Unix 且優雅。


然後你可以將(正如@Tushi徹底解釋的那樣)與-EOR-ing和-v否定選項結合。

你的具體例子非常令人討厭,可能會受益於一些更強大的實用程式(參見@muru的答案)。

相關內容