지난주의 시스템 로그를 분석하는 스크립트를 작성하고 싶습니다.
하지만 내 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 ;)