日志文件:仅处理早于“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

相关内容