특정 기간 내에 로그 파일을 grep하는 방법


22

로그 파일이 있는데 로그의 각 줄 앞에 날짜가 추가됩니다.

2012-03-06 11:34:48,657 blah blah blah...

grep이 파일을 어떻게 오전 8 시부 터 오후 11 시까지만 이용할 수 있습니까?

내 의도는 오전 8시에서 오후 11시 사이에 발생하는 오류 수를 계산하고 싶습니다.

답변:


24
egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

자세한 설명은 다양한 정규식 (일반 표현식) 자습서 에서 찾을 수 있습니다 . egrep"POSIX 확장"구문 ( man 7 regex)을 사용합니다.

  • 첫 번째 ^는 "라인의 시작"을 의미합니다.

  • [^ ]+ 실제 날짜와 관계없이 날짜 필드와 일치합니다.

    • [...]수단 "괄호 사이에 문자", 그래서 [89]하나 일치 8또는 9; [0-9]숫자이며, [^ ]아무것도이다 제외 (때문에의 공간 ^괄호 안에).

    • +수단 "하나 또는 그 이상의 이전의"(예를 들어, a+일치하는 것 a, aaa그리고 aaaaaaaa).

    • 따라서 ^[^ ]+줄의 시작으로 시작하여 가능한 많은 공백이 아닌 문자와 일치시킵니다.

  • (...|...|...)수단 "어느 특정 패턴"이므로 (0[89]|1[0-9]|2[012])"어느 방법 0[89]이나 1[0-9]또는 2[012]". 08에서 22까지의 모든 숫자와 일치합니다.


다소 더 나은 옵션은 다음과 같습니다.

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

-F옵션은 [: ]정규식 에 따라 ( :또는 공백과 일치하는) 모든 행을 별도의 필드로 분할 하고 awk 스크립트는 두 번째 열 (시간)을 확인합니다.


안녕하세요, 작동합니다. 어떻게 작동하는지 약간의 설명을 추가 할 수 있습니까? 나는 ^[^ ]+부분을 얻지
못합니다

20

왜 grep을 사용하지 않습니까? sed를 간단하게 사용할 수 있습니다.

예:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

이 모든 로그를 인쇄 할 사이 June 17 13:39:54June 18 10:50:28


1
OP가 오전 8시에서 오후 11시 사이의 모든 로그를 원한다고 생각합니다. 특정 날짜의 로그 만 봇합니다.
데니스

1
그는 그렇게 할 수 있습니다. 예 : sed -n '/ 2012-3-06 11:34:48 /, / 2012-3-06 16 : 34 : 48 / p'logfile.name
Nima G

1
불쾌한 오타. 나는 특정 날의 사람들이 아니라는 것을 의미 했습니다.
데니스

2
이 방법의 문제점은 로그 파일에 해당 타임 스탬프가있는 줄이 있어야한다는 것입니다. 위의 예에서 타임 스탬프가있는 행이 없으면 2012-03-06 11:34:48이 인쇄되지 않습니다. 위의 awk 접근 방식은 이러한 경우에 효과적입니다 (즉, 시간이 8에서 11 사이 인 모든 로그를 원하지만 2012-03-06 08:00:00 또는 그 시간에 로그 항목이 있는지 알 수 없습니다. 전혀 시간).
user650654

0

실제로이 작업을 수행하는 훨씬 쉬운 방법이 있습니다.

다운로드 / 문서 : autodrgrep.kl.sh

명령:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

설명:

  • autodrgrep.kl.sh는 도구 이름입니다.

  • notchef는 도구에 전달되어 수행 할 작업을 알려주는 옵션입니다. 이 특정 경우, 도구는 /tmp/client.log 유형의 로그 파일을 알려줍니다.

  • /tmp/client.log는 물론 로그 파일입니다.

  • 2016-05-08_19 : 12 : 00,2016-05-08_21 : 13 : 00은 로그에서 검색하려는 날짜 범위입니다.

  • "INFO"는 관심있는 로그 줄에있는 문자열 중 하나입니다.

  • "a2ensite"는 "INFO"문자열을 찾을 것으로 예상되는 같은 줄의 다른 문자열입니다. 이 두 문자열 (INFO 및 a2ensite)을 지정하면 특히 큰 로그 파일을 처리하는 경우 원하는 행을 훨씬 빠르게 분리하여 처리합니다.

  • 5는 경고를 지정합니다. 5를 지정하면 지정한 검색 문자열이 5 회 이상 있으면 프로그램에 경고 메시지가 표시됩니다.

  • 10은 위험을 지정합니다. 10을 지정하면 지정한 검색 문자열이 10 번 이상 있으면 프로그램에 CRITICAL로 경고합니다.

  • -show는 어떤 유형의 응답을받을 것인지 지정합니다. -shown을 지정하면 지정된 패턴과 일치하는 것이 있으면 화면에 출력됩니다.

샘플 실행 :

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

사용자가 지정한 날짜 범위 또는 시간 프레임이 로그에 없으면 어떻게합니까?

위 명령을 실행할 때마다 항상 "ATWFILF"또는 "ETWNFILF"라고하는 줄 (출력의 마지막 줄)이 있습니다.

  • ATWFILF는 검색을 요청한 실제 날짜 범위 또는 시간 프레임이 로그에서 발견되었음을 의미합니다. 그래서 이것은 매우 좋습니다.

  • ETWNFILF는 검색을 요청한 실제 날짜 범위 또는 시간 프레임이 로그에 없음을 의미합니다. 이 경우 지정한 시간에 가장 가까운 시간이 감지되어 대신 사용됩니다.

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