논리 연산자로 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. 없다그리고의 연산자 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가 자세히 설명했듯이 -EOR 옵션과 -v부정 옵션을 결합할 수 있습니다.

귀하의 구체적인 예는 매우 불쾌하며 아마도 더 강력한 유틸리티의 이점을 누릴 수 있습니다 (@muru의 답변 참조).

관련 정보