동일한 문자열이지만 여러 파일을 동시에 grep하는 방법은 무엇입니까?


57

검토해야 할 로그 파일 세트가 있으며 동일한 파일에서 특정 문자열을 한 번에 검색하고 싶습니다. 이것이 가능합니까? 현재 사용하고 있습니다

grep -E 'fatal|error|critical|failure|warning|' /path_to_file

이것을 어떻게 사용하고 한 번에 여러 파일의 문자열을 검색합니까? 이것이 스크립트가 필요한 것이라면 누군가가 간단한 스크립트를 제공 할 수 있습니까?


2
grep하나 이상의 파일 인수를 취할 수 있습니다.
jw013

답변:


61
grep -E 'fatal|error|critical|failure|warning|' *.log

grep디렉토리를 건너 뛰지 만 모든 파일을 재귀 적으로 확인 하는 방법은 무엇입니까? grep -E 'text' **/*작동하지만 각 하위 디렉토리에 대해 오류 메시지를 표시 한 다음 (그 안의 모든 파일을 올바르게 확인)
Jorn

4
@Jorn, 정말로 새로운 질문을해야하지만 다음을 사용하십시오find . -type f -exec grep -E 'fatal|error|critical|failure|warning' {} +
Wildcard

20

다음과 같은 것을 사용할 수 있습니다.

find . -name "*.log" | xargs grep -E 'fatal|error|critical|failure|warning|'

.log확장명을 가진 모든 파일을 찾고 grep명령을 적용합니다 .


너무 쉬웠습니다. :) 실제로 모든 파일은 .log이므로 "grep -E 'fatal | error | critical | failure | warning'* .log도 작동합니다. 감사합니다!
user53029

1
이해력 / 적응력의 엄청난 노력 user53029!
Gilles Quenot

1
왜 신경 xargs과에 대한 가능성 파일 이름에 공백에 심각한 파손 그냥 사용할 수 있습니다 find . -name '*.log' -exec grep -E 'fatal|error|critical|failure|warning' {} +?
와일드 카드

16

더 간단하면 각 파일을 하나씩 지정할 수 있습니다.

grep -E 'fatal|error|critical|failure|warning' file1.log file2.log 

2
너무 간단하지만 너무 오랫동안 이것을 찾고 있었다 : 0
Adam Hughes

3

정규식으로 검색 할 수없는 임의의 파일 이름 세트를 grep해야하는 경우 :

grep -E 'fatal|error|critical|failure|warning|' `cat<<FIN
> file1
> file2
> ...
> filen
> FIN`

파일 이름을 하나씩 붙여 넣을 때의 장점은 무엇입니까? 파일 이름 목록을 텍스트 파일로 컴파일 한 후 붙여 넣을 수 있습니다.


1

하위 디렉토리 파일에서도 재귀 적으로 검색하려면 아래 명령을 사용할 수 있습니다

하위 디렉토리 파일에서도 재귀 적으로 검색합니다.

egrep -r "string1|string2" pathname


0

이것은 시간이 많이 걸리는 작업이었습니다. 그렇습니다. 동시에 여러 개의 다른 로그에서 여러 개의 문자열을 검색하려면 반드시 스크립트를 작성해야합니다. 그러나 나는 최근에 이것을해야했고 그것은 매우 고통 스럽습니다. 그럼에도 불구하고, 준비가 완료되었으며 다음 링크에서 다운로드 할 수 있습니다.

로그 검색 스크립트 다운로드

이것이 작동하는 방식은 매우 간단합니다.

시나리오 1 : 하나의 로그 파일에서 하나의 문자열 모니터링

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open' '.'  1 2 single_errCheck -ndshow

시나리오 2 : 하나의 로그 파일에서 여러 문자열 모니터링

./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_errCheck -ndshow

시나리오 3 : 여러 로그 파일에서 단일 / 다중 문자열 모니터링

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 multi_err_multi_logCheck -ndshow

노트:

_P_는 OR을 의미합니다-파이프 "|"를 대체합니다 "_P_"가 포함 된 문자열을 검색해야 할 가능성이 적기 때문에 symbol입니다. "_P_"를 입력하지 않으려면 _P_를 "|"로 대체하면됩니다.

이 스크립트를 사용할 때 자주 변경하는 매개 변수는 다음과 같습니다.

  1. 모니터 할 로그 파일 또는 로그 디렉토리
  2. 로그 파일의 보존 기간은 반드시 모니터링되어야합니다. 60 분 이상의 타임 스탬프가있는 로그 파일을 모니터링하거나 검색하지 마십시오.
  3. 보고자하는 문자열 / 패턴
  4. 태그-이것은 두 번째로 마지막으로 제공해야하는 인수입니다. / var / tmp / logXray에서 모니터링하고있는 로그 파일에 대한 통계를 기록합니다.
  5. 로그 옵션 -ndshow-지정한 패턴과 일치하는 로그에서 항목을 출력하려는 ​​경우 사용하려는 매개 변수입니다. 발견 된 각 패턴의 총 수를 보려면 '-ndshow'를 '-ndfoundmul'로 바꾸십시오.

'-ndfoundmul'을 사용하면 다음과 비슷한 결과가 나타납니다.

[root@dgphxtest001]# ./logsearch.sh localhost /var/tmp/logXray autonda /var/log/messages 60m 'can.*t.*open_P_ntpd.*stat' '.'  1 2 blahblahA -ndfoundmul
OK: [/var/log/messages][1]  /var/log/messages:P=(can_t_open=0 ntpd_stat=0)_F=(117s)_R=(228,228=0) 

원본 포스터 문제에 대한 해결책 : 여러 로그 파일에서 여러 문자열 스캔

./logsearch.sh localhost /var/tmp/logXray autonda /var/log 60m 'fatal_P_error_P_critical_P_failure_P_warning' '.'  1 2 multierr_logCheck -ndshow

운영체제 : Ubuntu 및 Red Hat에서 테스트되었습니다.


0
grep -EFn "fatal|error|critical|failure|warning|search-string" /path/to/the/file/log_file?.lo* --color=auto

이것은 검색합니다 '치명적 오류 또는 중요한 실패 또는 경고 또는 검색 문자열' 로 시작하는 이름을 가진 파일의 'LOG_FILE?' / path / to / the / file / 경로 에 확장자 'lo '*를 입력하고 검색 문자열에 임의의 색상과 인쇄 줄 번호를 지정하십시오.


이것이 실제 답변이지만 사용자가 패턴을 사용하여 검색을 요청한 경우 고정 검색 문자열을 사용하여 응답했습니다. 죄송합니다. 결과의 줄 번호 매기기 및 채색과 같이 요청되지 않은 항목을 추가해도 더 유용한 답변을 얻을 수는 없습니다. 그러나 grepUSE 커리어에서 가장 좋은 행운 을 얻을 수있는 다른 질문이있을 것입니다 !
zagrimsan

@zagrimsan 포인트, -E '치명적 | 오류 | 치명적 | 실패 | 경고 |'를 추가했습니다 그것에 매개 변수.
Obaid

그리고 그는 특히 검색 패턴이 아닌 여러 파일을 요청했습니다. 질문을 다시 읽으십시오.
Obaid

Q : "특정 문자열 검색"에서 인용하면 질문에 그가 사용하는 검색 패턴 (여러 문자열이 포함됨)이 표시됩니다. 그러나 질문의 ​​제목은 그가 실제로 요구하는 것과 약간 다릅니다. BTW이며 -E동시에 -F사용할 수 없으면 충돌합니다 (오타?).
zagrimsan

0

JigarGandhi의 답변 은 별표 와일드 카드 사용을 보여줍니다. 더 많은 것들이 있으며 여기 에서 또는를 실행 하여 볼 수 있습니다man 7 glob .

내가 찾은 것 중 하나는와 일치하는 범위입니다 []. 내가 작업하는 시스템은 순차적으로 번호가 매겨진 로그 파일 (예 :)을 생성하기 때문에 product.log.1 product.log.2 ... product.log.2003 개 또는 4 개의 순차 파일에서 단일 명령으로 grep하는 것이 편리하지만 그 이상은 아닙니다. 그래서 이건

grep 'whatever' product.log.[5-7]

product.log로 끝나는 모든 파일을 grep합니다. 와일드 카드는 끝에있을 필요가 없으므로 플리커 플라이의 대답 을 다음과 같이 단순화 할 수 있습니다.

grep -E 'fatal|error|critical|failure|warning' file[1,2].log

이러한 와일드 카드는 cp예를 들어 다른 명령에서도 사용될 수 있습니다 .


0

파일이 모두 같은 폴더 인 경우 중괄호를 사용할 수도 있습니다.

예를 참조하십시오

grep -E 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

grep에 s를 추가하면 누락 된 파일에 대한 오류가 발생합니다.

grep -sE 'fatal|error|critical|failure|warning|' /var/log/{messages,secure,syslog,dmesg}

OS 차이로 인해 하나의 파일과 다른 파일에있는 여러 배포판에서 작동하는 명령을 수행하기 위해 직접 실험했습니다.

메일 로그

sudo grep -is bob@example.com /var/log/{maillog,exim_mainlog,exim_rejectlog,mail.log,mail.err,syslog}

2> / dev / null을 사용하여 zgrep에서 .gz 경고 누락을 억제하는 보관 된 메일 로그

sudo zgrep -is bob@example.com /var/log/{maillog*,exim_mainlog*,exim_rejectlog*,mail.log*,mail.err*,syslog*} 2>/dev/null

참조 : 전체 경로를 다시 입력하지 않고 디렉토리에서 여러 파일을 참조하는 방법이 있습니까?

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