시스템 로그 날짜 형식을 구문 분석하는 간단한 방법

시스템 로그 날짜 형식을 구문 분석하는 간단한 방법

지난주의 시스템 로그를 분석하는 스크립트를 작성하고 싶습니다.

하지만 내 syslog는 "5월 22일"과 같은 어리석은 날짜 형식으로 기록됩니다. 2013-05-22로 기록된 경우 이 작업은 간단합니다.

awk/bash/perl/sed를 사용하여 두 날짜/시간 사이의 모든 줄 로그를 쉽게 "grep"하는 방법이 있습니까?

답변1

이것은 나에게는 너무 복잡하지만 여러분에게는 흥미로울 수 있습니다.

perl -p -e '
BEGIN{ 
        @months=qw(jan feb mar apr may jun jul aug sep oct nov dec);
        $month_number{$_}=++$i for @months;
        $months_regex= join "|",@months;
     }
s/^\s*($months_regex)[a-z]*\s+/$month_number{lc $1}-/i'
/var/log/syslog

그러면 쉽게 구문 분석할 수 있는 것처럼 보이는 MM-DD 형식(제로 패딩이 없는 월 번호)의 날짜가 포함된 로그 줄이 표준 출력으로 인쇄됩니다. 대소문자에 관계없이 전체 형식으로 제공된 월 이름과 3글자 형식으로 제공된 월 이름을 처리합니다.


편집하다

월 번호를 0으로 채우려면 다음 ++$i으로 바꾸십시오.sprintf "%02d",++$i

편집 2 두 가지 오류를 수정했습니다. 감사합니다.l0b0님의 의견은 다음과 같습니다.

  • 달 목록에 "5월"을 추가하세요.
  • 제로 패딩 레시피를 다음으로 변경합니다.sprintf "%02d", ++$i

답변2

이것이 제가 Perl에서 하는 방법입니다. 비록 저는 다른 답변을 선호하지만요!

use DateTime::Format::Strptime;
my $parser = DateTime::Format::Strptime->new( pattern => '%B %d %Y');
m/^(\w+ \d+)/;
print $parser->parse_datetime("$1 " . DateTime->now->year)->ymd;

답변3

괜찮나요?

각 행의 보유 날짜는 > 10일 및 < 18일입니다.

awk '$2 > 10 && $2 < 18 {print}' file

월 이름 포함:

awk '$1 == "May" && $2 > 10 && $2 < 18 {print}' file

4월 27일부터 5월 4일까지의 기간:

awk '($1 == "Apr" && $2 > 26) || ($1 == "May" && $2 < 5){print}' file

고쳐 쓰다:

getline을 사용한 대략적인 변형:

awk '"date '+%m%d' -d " $1$2 | getline date; close("date"); \
date > 426 && date < 505 {print}' file

스크립트 사용:

awk -v from=520 -v to=523 '
{
    d = ((match("JanFebMarAprMayJunJulAugSepOctNovDec", $1) + 2) / 3 )$2;
    if (d >= from && d <= to)
        print;

}
' file

스위치를 사용하십시오:

awk -v from=520 -v to=523 '
function date2time()
{
    switch ($1) {
    case "Jan": return 1$2; break;
    case "Feb": return 2$2; break;
    case "Mar": return 3$2; break;
    case "Apr": return 4$2; break;
    case "May": return 5$2; break;
    case "Jun": return 6$2; break;
    case "Jul": return 7$2; break;
    case "Aug": return 8$2; break;
    case "Sep": return 9$2; break;
    case "Oct": return 10$2; break;
    case "Nov": return 11$2; break;
    case "Dec": return 12$2; break;
    }
}
{
    d = date2time();
    if (d >= from && d <= to)
        print;

}
' file

배열을 사용하십시오:

... oh see you have gotten your answer ;)

관련 정보