从日志文件中提取当前时间的 X 分钟数

从日志文件中提取当前时间的 X 分钟数

我有一个具有以下时间戳格式的日志文件

2016-06-02 13:59:58.069

我正在处理的日志大约持续一个小时。

2016-06-02 13:05:06.144
2016-06-02 13:05:06.144
2016-06-02 13:05:06.160
2016-06-02 13:05:06.160
2016-06-02 13:05:06.176
2016-06-02 13:05:06.177
.
.
.
.
2016-06-02 14:05:03.033
2016-06-02 14:05:03.034
2016-06-02 14:05:03.034
2016-06-02 14:05:03.084
2016-06-02 14:05:03.096
2016-06-02 14:05:03.112

当我尝试使用 awk 提取最后 10 分钟时,我仍然得到整个文件。

awk -vDate=`date -d'now-10 minutes' +%Y/%m/%d:%H:%M:%S` '$1,$2 >   Date {print Date, $0}' logfile.log | less

awk 输出:

2016/06/02:08:57:35 2016-06-02 13:05:06.144
. 
.
.
2016/06/02:08:57:35 2016-06-02 14:08:05.214

我究竟做错了什么?

答案1

使用不同的方法。我获取 vDate,grep以获取行号和tail该行号中的文件:

vDate=`date -d'now-10 minutes' '+%Y-%m-%d %H:%M'` 
line=`grep  -n "$vDate" logfile.log | head -1  | cut -d: -f1`
tail -n +${line} logfile.log

答案2

尝试

awk -vDate="`date -d'TZ="UTC" now-10 minutes' +'%Y-%m-%d %H:%M:%S.%3N'`" '$1" "$2 > Date {print Date, $0}'

在模式中$1,$2 > Date,逗号并不像在输出中那样表示“连接这些字段”;而是表示“连接这些字段”。相反,这意味着该模式是记录范围$1是一个非空字符串,始终为true,因此匹配立即开始。在比较之前,您需要在此处放置一个文字空格来连接字段:$1" "$2

接下来,您可以在示例输出中看到您设置Date为“2016/06/02:...”,而日志使用“2016-06-02 ...”。当您比较日期时字符串,并且/晚于-ASCII,测试永远不会成功。更改字符串格式以完全匹配(添加一些引号以保护它免受 shell 影响)意味着只有数字会有所不同。

编辑: 您的日志文件时间戳比显示的晚了几个小时date -d'now-10 minutes'。您可以通过环境变量 ( ) 或在日期字符串内date使用相关时区。如果不是,请从中选择正确的一个TZ=UTC awk ...'TZ="UTC" now...'UTC完整列表

答案3

awkstart_pattern可以使用和打印节中文本的行end_pattern,使用以下语法:

$ awk '/start_pattern/, /end _pattern/' filename

引用自Linux Shell 脚本手册

所以,你可以这样做:

awk '/2016-06-02 13:55/, /2016-06-02 14:05/' logfile`

如果需要,您也可以将其写入脚本文件:

START=`date --date='now-10 minutes' '+%Y-%m-%d %H:%M'`
END=`date --date='now' '+%Y-%m-%d %H:%M'`
awk "/$START/, /$END/" logfile

相关内容