我有一个具有以下时间戳格式的日志文件
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
awk
start_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