ログファイル:「MMM DD HH:MM:SS」より古いエントリのみを処理します。

ログファイル:「MMM DD HH:MM:SS」より古いエントリのみを処理します。

私のログファイルを処理する必要があります/var/log/mylogs.log。私は新しいエントリだけに興味がありますが、Jul 20 15:00:00ログには以前のエントリも含まれているからです。

cat特定の日付より古い項目だけを入力する簡単な方法はありますか?

答え1

日付を解析するための小さなスクリプトを書くことができますbashdate

#!/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

関連情報