grep을 사용하여 단어의 존재와 다른 단어의 부재를 검색하는 방법

grep을 사용하여 단어의 존재와 다른 단어의 부재를 검색하는 방법

다음과 유사한 내용의 파일이 있습니다.

google.com,9,AB+CD,nonAB+nonCD
youtube.com,9,AB+CD,AB+CD
facebook.com,20,AB+CD,nonCD

열 개수는 고정되어 있지 않습니다. 그러나 첫 번째 열은 URL이고 두 번째 열은 숫자이며 세 번째 열은 쉼표로 구분된 키워드이지만 사이트마다 다릅니다.

줄에 어떤 키워드가 있는지 제어할 수 있는 URL(줄) 수를 계산하고 싶습니다. 예를 들어
1) 및 AB+CD가 없습니다 . 참고: AB+CD라는 단어는 여러 번 나타날 수 있습니다. 2) AB+CD가 발생하지 않는 경우 (단, 다른 것이 있어도 괜찮습니다)nonABnonCDnonCD

한 줄에서 문자열을 검색하고 다른 문자열이 없는지 확인하는 방법. 내가 사용할 때 :

grep 'AB+CD' test.txt > result.txt

'AB+CD'가 발견되는 모든 줄을 인쇄합니다.

얻을 수 있는 'AB+CD'만 ​​있는 줄을 인쇄하려면 어떻게 해야 합니까?

youtube.com,9,AB+CD,AB+CD

또는 'nonAB'를 제외한 다른 항목과 함께 'AB+CD'를 사용하면 다음을 얻을 수 있습니다.

youtube.com,9,AB+CD,AB+CD
facebook.com,20,AB+CD,nonCD

답변1

열을 신경 쓰지 않고 일반 텍스트 검색을 원할 경우 grep -v다음과 같이 반전된 일치 항목을 연결할 수 있습니다.

cat input.txt | grep 'IncludedText' | grep -v 'ExcludedText'

열별로 적절한 필터링을 수행하려면 다음과 같은 것을 사용하는 것이 좋습니다 awk.

답변2

일반적인 요령:

  1. ( )를 포함하는 foo플러스 라인을 포함하는 라인 :barfoo OR bar

    grep -e foo -e bar
    
  2. foobar같은 줄을 포함하는 줄 ( foo AND bar):

    grep foo | grep bar
    
  3. baz( ) 를 포함하지 않는 줄 NOT baz:

    grep -v baz
    

이 브릭을 사용하여 논리를 구축할 수 있습니다. 문제는 -v단일 패턴에 국한되지 않고 전체에 걸쳐 적용됩니다 grep(적어도 내 데비안에서는). 이를 통해 NOT (foo OR bar)다음이 가능해집니다.

grep -v -e foo -e bar

이는 다음과 같습니다 (NOT foo) AND (NOT bar):

grep -v foo | grep -v bar

그러나 NOT (foo AND bar)(논리적으로 와 동일 (NOT foo) OR (NOT bar))은 그렇게 쉽지 않습니다. foo AND bar우리 는하나의(확장) grep:

  1. 다시 같은 줄에 foo및 를 포함하는 줄( ):barfoo AND bar

    grep -E 'foo.*bar|bar.*foo'
    

지금 얻으려면 NOT (foo AND bar):

grep -v -E 'foo.*bar|bar.*foo'

2개 이상의 패턴을 다룰 때 위의 내용이 완전한 시스템인지는 잘 모르겠습니다. 아직도 해결할 수 있는 문제는 거의 없습니다. 예:

AB+CD없이 nonAB그리고nonCD

내가 당신을 올바르게 이해한다면 그것은AB+CD AND NOT (nonAB OR nonCD)

grep AB+CD | grep -v -e nonAB -e nonCD

이 요청은 상황을 복잡하게 만듭니다.

'AB+CD'만 ​​있는 줄을 인쇄하고 싶습니다.

그렇게 할 것이라고 말할 수도 있지만 grep ,AB+CD,AB+CD"열 수는 고정되어 있지 않기 때문에" 다음 두 줄을 구분하고 싶을 것입니다.

youtube.com,9,AB+CD,AB+CD,AB+CD
youtube.com,9,AB+CD,AB+CD,banana

그러한 경우에는 더 복잡한 정규 표현식이나 기타 도구(예: )가 필요합니다 awk.

답변3

여기에서 답변을 얻을 수 있지만 다음을 살펴봐야 합니다.남자 grep(압도적일 수 있음) 그리고몇 가지 예. 당분간 답변은 다음과 같습니다.

사용grep

grep "foobar" test.txt

foobar파일에 단어가 있는 줄을 검색 test.txt하고 모든 항목을 표시합니다.

grep "foo" -v "bar" test.txt

foo단어가 있지만 단어 가 없는 행을 검색합니다 bar. 우리는 이것을 얻습니다.-v맨페이지에서 설명하는 스위치:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.
    (-v is specified by POSIX .)

이는 단순히 해당 단어(here)가 있는 줄을 검색 bar하지만 최종 표시에서는 제외한다는 의미입니다. 따라서검색 반전.

또한 검색과 일치하는 줄 수를 계산하려면 다음을 사용하십시오.-c스위치:

-c, --count
    Suppress normal output; instead print a count of matching lines
    for each input file. With the -v, --invert-match option (see below),
    count non-matching lines. (-c is specified by POSIX .)

자가 연습으로 파일에서 grep 검색을 직접 시도해 보세요.푸바.

대답

AB+CDURL 무시 nonABnonCD계산 검색 :

grep "AB+CD" test | grep -cve "non"

여기서는 -v "non"둘 다 무시 nonAB하고 nonCD둘 다 무시 합니다 non. 그리고 -c인쇄하는 대신 일치하는 항목의 총 개수를 제공합니다. 일치하는 줄을 인쇄하려면 무시하면 됩니다 -c.

별도의 반전에 사용할 수 있습니다.

grep "AB+CD" test | grep -cve "nonAB\|nonCD"

여기서는 또는 중 하나를 \|나타내고 의미합니다.ORnonABnonCD 정확한에 의해 지정된 단어-e스위치.


당신에게 조언 할 것입니다Kamil의 답변을 참조하십시오, 맨페이지(명령어를 알고 있음)를 최대한 읽고, 온라인에서 자료를 검색하면서 열심히 노력하고 커뮤니티에 봉사하세요. 답변하려면 더 자세한 내용을 추가해 주세요.

관련 정보