논리 연산자로 grep


19

논리 연산자로 grep 검색을 수행 할 수있는 grep 유사 유틸리티가 있습니까? 논리 구조를 자유롭게 중첩하고 결합 할 수 있기를 원합니다. 예를 들어 다음과 같은 것이 가능해야합니다.

grep (term1 && term2) || (term1 && (term3 xor term4)) *

나는 이것이 바닐라 grep과 추가 bash 스크립팅으로 수행 할 수 있다는 것을 알고 있지만, 나의 목표는 그렇게하지 않는 것입니다.

grep 

답변:


12

을 (를) 사용 awk하여에서와 같이 perl용어를 래핑해야 //하지만 수행 할 수 있습니다.

awk '(/term1/ && /term2/) || (/term1/ && xor(/term3/, /term4/))' 

28

grep논리 연산자와 함께 사용 하는 방법은 많이 있습니다 .

  1. OR 조건에 \|대해 여러 패턴을 분리하는 데 사용하십시오 .

    예: grep 'pattern1\|pattern2' filename

  2. OR 조건에 -E대해 여러 패턴을 보내 려면이 옵션을 사용하십시오 .

    예: grep -E 'pattern1|pattern2' filename

  3. 단일을 사용하면 -e하나의 패턴 만 일치하지만 여러 -e옵션을 사용하면 둘 이상의 패턴과 일치합니다.

    예: grep -e pattern1 -e pattern2 filename

  4. grep -vNOT 연산을 시뮬레이션 할 수 있습니다 .

  5. AND 연산자 가 없지만 옵션 을 사용하여 grep시뮬레이션 AND 를 무차별화할 수 있습니다 -E.

    예 : grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

    위의 예는 pattern1pattern2 를 모두 포함하는 모든 줄을 순서대로 일치시킵니다 .)


1
-E아니 아주 동일하다 &&는 주문 민감하다는 사실에 기인
iruvar

grep foo | grep barAND를 수행하는보다 일반적인 방법입니다.
Kenster

2
+1은 실제 "AND"연산자가 없으며 OR 구조를 사용하여 해킹을 시뮬레이션하는 것이 가장 좋다고 명확하게 설명합니다. 이것은 물론 3 개 이상의 용어로 다루기 어려워 지지만 두 용어에서는 잘 작동합니다.
Eric Hepperle-CodeSlayer2010

grep -c -e MATCH1 -e MATCH2는 파일 이름 개수에 관심이있을 때 유용합니다.
andrej

4

당신은 펄을 사용할 수 있습니다 :

perl -wne 'print if (/term1/ && /term2/) || (/term1/ && (/term3/ xor /term4/))'

0
sed '/term1/!d;/term2/b' -e '/term3/!d;/term4/d' *

나는 그것이 당신이하려는 일을 성취한다고 믿습니다. 그것은 d출력과 일치하지 않는 선에서 eletes term1는, b스크립트 밖으로 목장 (및 autoprints 때문에) 어떤 라인이 남아 그 일치 term2와 일치하지 않는 하나를 삭제 남아 라인 term3과 일치 할 것과 어떤에서 term4.

sed 스크립트는 순서대로 평가되며 모든 테스트는 부울이므로 테스트로 인한 모든 작업은 다음 작업의 동작에 직접 영향을 미칩니다.


0

grep논리적 AND를 달성하기 위해 명령 을 연결하는 데 사용합니다 .

grep expr1 filename | grep expr2

나는 그것이 매우 간단하고 유닉스와 같고 우아하다고 생각합니다.


그런 다음 @ -Tushi와 함께 -EOR-ing 옵션 과 결합하여-v 부정 .

특정 예제는 매우 불쾌하며 아마도 더 강력한 유틸리티의 이점을 얻을 것입니다 (@muru의 답변 참조).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.