논리 연산자를 사용하여 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
나는 그것이 매우 단순하고 유닉스와 유사하며 우아하다고 믿습니다.
-E
그런 다음 @Tushi가 철저하게 설명했듯이 OR-ing 및 -v
부정 옵션을 결합할 수 있습니다 .
귀하의 구체적인 예는 매우 짜증나고 더 강력한 유틸리티의 이점을 누릴 수 있습니다 (@muru의 답변 참조).