すべての行の先頭に日付と時刻が記載されたログファイルがあります。
ログファイルを特定の時間からファイルの最後まで検索する必要があります。
例えば:
Starting point: July 29 2018 21:00:00
End point : end of file
私の懸念は、July 29 2018 21:00:00
のパターンが存在しない場合でも、たとえばJuly 29 2018 21:05:11
を超えているため、たとえばJuly 29 2018 21:00:00
の間に線が引かれることです。
awk
またはsed
はこれで機能しますか?
これには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
これを試して:
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
パターンを変更できます。
定義された文字列に一致する最初の行を検索できます(つまり、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
sed
を使用すると、次のことができます
sed -n '/July 29 2018 21:/,/$!d/p' file
これにより、2018年7月29日21:**からファイルの最終行までのすべての行が取得されます。