특정 시간부터 파일 끝까지의 grep 로그 파일

특정 시간부터 파일 끝까지의 grep 로그 파일

각 줄의 시작 부분에 날짜와 시간이 포함된 로그 파일이 있습니다.

특정 시간부터 파일 끝까지 로그 파일을 검색해야 합니다.

예를 들어:

Starting point: July 29 2018 21:00:00
End point     : end of file

내 관심사는 패턴이 존재하지 않더라도 여전히 초과되기 때문에 July 29 2018 21:00:00사이의 경계를 얻을 수 있다는 것입니다 .July 29 2018 21:05:11July 29 2018 21:00:00

awk, 아니면 sed일을 하시나요?

답변1

각 행의 타임스탬프를 구문 분석하기 위해 Perl을 사용하여 이 작업을 수행하겠습니다.

$ cat file
June 5 2018 00:00:00 do not print
July 29 2018 20:59:59 do not print
July 29 2018 21:00:00 print me
July 29 2018 21:00:01 print me

$ perl -MTime::Piece -sane '
    BEGIN {
        $start = Time::Piece->strptime($startdate, "%B %e %Y %T");
    }
    # the string "@F[0..3]" is the first 4 words on the line
    $time = Time::Piece->strptime("@F[0..3]", "%B %e %Y %T");
    print if $time >= $start;
' -- -startdate="July 29 2018 21:00:00" file
July 29 2018 21:00:00 print me
July 29 2018 21:00:01 print me

이 버전은 시작 날짜가 확인되는 즉시 타임스탬프 구문 분석을 중지하므로 더 효율적입니다(파일이 시간순으로 정렬되어 있다고 가정).

perl -MTime::Piece -sane '
    BEGIN {
        $start = Time::Piece->strptime($startdate, "%B %e %Y %T");
    }
    unless ($go) {
        $time = Time::Piece->strptime("@F[0..3]", "%B %e %Y %T");
        $go = $time >= $start;
    }
    print if $go;
' -- -startdate="July 29 2018 21:00:00" file

답변2

이 시도:

grepfromdate() {
    readarray f < $1
    fromdate=$(date +%s -d "$2")
    for (( lineno=${#f[@]}-1 ; lineno>=0; lineno-- )) ; do
        line=${f[$lineno]}
        time_from_line=$(echo "$line" | grep -o "^[A-Z][a-z]* [0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]")
        [[ $(date +%s -d "$time_from_line") -gt $fromdate ]] && echo "$line" || break
    done | tac
}

용법:
grepfromdate "filename" "July 29 2018 21:00:00"

date예를 들어, 읽을 수 있는 모든 날짜 형식을 전달할 수 있습니다 2018-07-01. 날짜 형식이 변경되면 grep그에 따라 모드를 변경할 수 있습니다.

답변3

정의된 문자열(예: July 29 2018 21:오후 9시 이후의 모든 항목)과 일치하는 첫 번째 줄을 검색할 수 있습니다. 이 줄 번호가 있으면 tail찾은 줄 번호로 시작하는 파일을 찾을 수 있습니다.

   $ man tail
   -n, --lines=[+]NUM
          output the last NUM lines, instead of the last 10; or use -n +NUM to output starting with line NUM

내 예:

$ log=/var/log/syslog

# get line number
$ first_line=$(grep -no "Aug 14 08:" $log | tail -n1 | cut -d: -f1)

# count the lines from $first_line to EOF
$ tail -n +$first_line $log | wc -l
24071

# output the content starting with $first_line
$ tail -n +$first_line $log

# line count of the whole file:
$ wc -l $log
70896 /var/log/syslog

답변4

너랑 할 수 sed있어

sed -n '/July 29 2018 21:/,/$!d/p' file

이렇게 하면 2018년 7월 29일 21:**과 파일의 마지막 줄 사이의 모든 줄이 제공됩니다.

관련 정보