
논리 연산자를 사용하여 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 확장은 논리적 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
논리적 AND를 달성하기 위해 명령을 연결하는 데 사용합니다.
grep expr1 filename | grep expr2
나는 그것이 매우 간단하고 유닉스와 유사하며 우아하다고 믿습니다.
그런 다음 @Tushi가 자세히 설명했듯이 -E
OR 옵션과 -v
부정 옵션을 결합할 수 있습니다.
귀하의 구체적인 예는 매우 불쾌하며 아마도 더 강력한 유틸리티의 이점을 누릴 수 있습니다 (@muru의 답변 참조).