我需要处理我的日志文件/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