로그 파일: "MMM DD HH:MM:SS"보다 오래된 항목만 처리합니다.

로그 파일: "MMM DD HH:MM:SS"보다 오래된 항목만 처리합니다.

내 로그 파일을 처리해야 합니다 /var/log/mylogs.log. 나는 새 항목에만 관심이 있지만 Jul 20 15:00:00로그에는 이전 항목도 포함되어 있기 때문입니다.

cat특정 날짜보다 오래된 항목 만 입력할 수 있는 쉬운 방법이 있습니까 ?

답변1

날짜를 구문 분석하기 위한 작은 스크립트를 작성할 수 있습니다 bash.date

#!/usr/bin/env bash

## Your date threshold
limit="Jul 20 15:00:00"
## Your limit in seconds since the UNIX epoch
limit_seconds=$(date -d "$limit" +%s)

while read line; do
    ## Extract the date and convert to seconds since epoch for comparison
    date=$(date -d "$(echo "$line" | cut -d ' ' -f -4)" +%s);
    ## Is this newer than the limit? If yes, print the line
    if [ "$date" -ge "$limit_seconds" ]; then
    echo "$line"
    fi

done

이 스크립트를 경로(예 /usr/local/bin/parse_log.sh: )에 저장한 후 다음과 같이 실행할 수 있습니다.

parse_log.sh < /var/log/mylogs.log

답변2

Perl을 사용하여 이 작업을 수행하는 데 관심이 있을 수 있습니다.

perl -wlne '/^Jul\ 20\ 15\:00\:00/ .. eof() and print' /path/to/logfile.txt

특정 요구 사항에 맞게 정규식을 조정해야 할 수도 있습니다.

답변3

날짜를 쉽게 조작할 수 있는 언어로 이 작업을 수행하는 것이 가장 좋습니다. 각 로그 줄은 mmm dd HH:MM:SS날짜 형식으로 시작하고 모든 로그 항목은 현재 연도의 것이라고 가정합니다 .

<var/log/mylogs.log perl -MDate::Parse -e '
    $cutoff = str2time($ARGV[0]);
    while (<STDIN>) {
        print if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
                 str2time($1) <= $cutoff
    }
' 'Jul 20 15:00:00'

이 코드 조각은 이전 날짜가 있는 모든 행을 인쇄합니다. 최신 항목이 필요한 경우 비교를 반대로 수행하십시오( str2time($1) >= $cutoff). 오래된 항목을 인쇄할 때 항목이 너무 늦게 도착하면 즉시 종료하여 처리 시간을 절약할 수 있습니다.

<var/log/mylogs.log perl -MDate::Parse -e '
    $cutoff = str2time($ARGV[0]);
    while (<STDIN>) {
        exit if /^(... [ 0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])/ and
             str2time($1) > $cutoff;
        print;
    }
' 'Jul 20 15:00:00'

답변4

또한 sed를 사용해 보십시오:

sed -n '/^Jul\ 20\ 15\:00\:00/,/eof()/p' /path/to/logfile.txt

관련 정보