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

Use 는 awkusing 과 마찬가지로 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의 답변 참조).

관련 정보