다중 패턴 제외 어 일치


14

표준 로그 형식을 사용하는 많은 Apache 로그가 있습니다. 웹 크롤러에서 제공되지 않은 모든 로그 라인을 가져오고 싶습니다.

그래서 다음과 같은 항목이있는 robot_patterns 파일이 있다고 가정 해 봅시다.

Googlebot
msnbot-media
YandexBot
bingbot

명령을 실행 grep -f robot_patterns *.log하면 위 패턴과 일치하는 봇으로 모든 항목을 가져옵니다. 내 실제 목록에는 ~ 30 개의 봇 및 에이전트 항목이 있습니다.

그러나 아닌 모든 항목을 찾고 싶습니다 . 그래서 나는 시도 grep -v -f robot_patterns *.log하고 grep에 의해 결과가 반환되지 않습니다. 이것은 내가 기대하거나 원하는 것이 아니며, 내가 원하는 것을 얻는 확실한 방법을 찾지 못했습니다. -v파일에서 여러 패턴과 결합 된 옵션을 사용하는 경우 grep은 모든 패턴과 일치하는 경우에만 일치하는 줄을 반환합니다.


시스템 에서이 작업을 시도했을 때 grep -v -f는 원하는 동작을 보였으며 패턴과 일치하지 않는 행만 반환했습니다. 이것은 (GNU grep) 2.14.56-1e3d와 함께였습니다. 어떤 grep을 사용하고 있습니까?
wingedsubmariner

나는 달리고있다 GNU grep 2.6.3.
Zoredache

4
좀 더 테스트를 해본 결과, 패턴 파일에 빈 줄이 있으면 모든 줄과 일치하여 -v로 줄을 반환하지 않습니다. 그러나 이것은 -F의 문제가 아니며 -F는 작업의 grep 속도를 높일 수 있습니다-시도해 볼 가치가 있습니다.
wingedsubmariner

후행 빈 줄! 아아 ... 그게 문제인 것 같습니다. 원하는 경우 답변으로 추가해야합니다.
Zoredache

답변:


8

패턴 파일에 빈 줄이 있으면 모든 줄과 일치하여 줄이 반환되지 않습니다 -v. 행이 정규식으로 해석되고 빈 정규식이 항상 일치하기 때문입니다.

-F그러나 grep와 함께 빈 줄을 무시 하기 때문에 이것은 문제가되지 않습니다 -F.
-F원인은 grep검색 할 단순 문자열로 라인을 해석하고 속도가 빨라질 수 있습니다 grep정규 표현식이 필요하지 않은 경우.


1
fgrep빈 문자열 뒤에 오는 것을 무시하는 GNU 는 2.19에서 수정 된 버그 ( commit 2d3832e1ff772dc1a374bfad5dcc1338350cc48b 이므로 의존해서는 안 됨)
Stéphane Chazelas

13

당신은 시도 할 수 있습니다:

grep -vE 'Googlebot|msnbot-media|YandexBot|bingbot' yourlogfile

2
유닉스 및 리눅스에 오신 것을 환영합니다. OP에는 무시하려는 약 30 개의 문자열 목록이 있으며, 그가 예로 든 4 개의 문자열은 각각 평균 ​​10 자이므로 명령의 길이는 300 자 이상입니다. 이것은 유지 관리가 어렵고 읽기가 어려울 수 있습니다. OP의 문자열 목록에 따라 답을 수정할 수 있습니까? ………………………… PS PS 답을 찾았다는 것을 알고 계셨습니까? — OP는 자신의 원래 접근 방식을 작동시키는 방법을 배웠습니다.
G-Man, 'Reinstate

2
왜 내 응답을 부정적으로 평가합니까? : /
Orsius

3
좋은 대답입니다. 정규식 OR이 있고 -vE 옵션이 도움이되었습니다.
Kirt Carson

3
이것은 대부분의 사람들이 해결하려고하는 질문에 대한 답변입니다.
Perfi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.