다음과 유사한 내용의 파일이 있습니다.
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가 발생하지 않는 경우 (단, 다른 것이 있어도 괜찮습니다)nonAB
nonCD
nonCD
한 줄에서 문자열을 검색하고 다른 문자열이 없는지 확인하는 방법. 내가 사용할 때 :
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
일반적인 요령:
( )를 포함하는
foo
플러스 라인을 포함하는 라인 :bar
foo OR bar
grep -e foo -e bar
foo
및bar
같은 줄을 포함하는 줄 (foo AND bar
):grep foo | grep bar
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
:
다시 같은 줄에
foo
및 를 포함하는 줄( ):bar
foo 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+CD
URL 무시 nonAB
및 nonCD
계산 검색 :
grep "AB+CD" test | grep -cve "non"
여기서는 -v "non"
둘 다 무시 nonAB
하고 nonCD
둘 다 무시 합니다 non
. 그리고 -c
인쇄하는 대신 일치하는 항목의 총 개수를 제공합니다. 일치하는 줄을 인쇄하려면 무시하면 됩니다 -c
.
별도의 반전에 사용할 수 있습니다.
grep "AB+CD" test | grep -cve "nonAB\|nonCD"
여기서는 또는 중 하나를 \|
나타내고 의미합니다.OR
nonAB
nonCD
정확한에 의해 지정된 단어-e
스위치.
당신에게 조언 할 것입니다Kamil의 답변을 참조하십시오, 맨페이지(명령어를 알고 있음)를 최대한 읽고, 온라인에서 자료를 검색하면서 열심히 노력하고 커뮤니티에 봉사하세요. 답변하려면 더 자세한 내용을 추가해 주세요.