
是否有類似 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
可以模擬不是手術。沒有和運算符 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徹底解釋的那樣)與-E
OR-ing和-v
否定選項結合。
你的具體例子非常令人討厭,可能會受益於一些更強大的實用程式(參見@muru的答案)。