3

尝试使用 (grep 匹配) 提取最后 5 分钟的日志

所以我做了一个tac syslog.log | sed / date -d "5 minutes ago"

日志中的每一行都显示这种格式

Jun 14 14:03:58  
Jul  3 08:04:35 

所以我真的很想从

Jul  4 08:12
Jul  4 08:17

我尝试了这种方法,但 KINDA 有效(尽管从 08:12 到 08:17 开始,它仍然每天都在经历)

e=""
for (( i = 5; i >= 0; i-- ))
do
    e='-e /'`date +\%R -d "-$i min"`':/p '$e; 
done

tac /var/log/syslog.log | sed -n $e 
4

6 回答 6

2
e=""
for (( i = 5; i >= 0; i-- ))
do
    if [[ -z $e ]]
    then e=`date +\%R -d "-$i min"`
    else e=$e'\|'`date +\%R -d "-$i min"`
    fi
done
re=' \('$e'\):'
tac /var/log/syslog.log | sed -n -e "/$re/p" -e "/$re/!q"

这将创建一个正则表达式列表,列出过去 5 分钟内的所有时间,并与\|. 它打印与它们匹配的行。然后它使用!修饰符在与 RE 不匹配的第一行退出。

于 2013-07-04T00:51:17.653 回答
1

如果您知道日期的格式,那么为什么不这样做:

tac syslog.log | awk '/Jul  4 08:17/,/Jul  4 08:12/ { print } /Jul 4 08:11/ {exit}'

/ .. /,/ .. /正则表达式范围。它将打印此范围内的所有内容。因此,一旦您/Jul 4 08:11/在您的线路上看到这意味着您的 5 分钟窗口已被捕获,您就退出阅读该文件。

于 2013-07-04T02:05:50.937 回答
0

OK 最后看起来这次它真的有效(它在一个小时后使用 SED 而不是 awk 退出,最终让它通过一些测试运行。

tac /var/log/syslog.log | sed -e "$( date -d '-1 hour -6 minutes' '+/^%b %e %H:/q;' 
   date -d '-1 day -6 minutes' '+/^%b %e /q;'
      date -d '-1 month -6 minutes' '+/^%b /q;'
for ((o=0;o<=5;o++)) do date -d "-$o minutes" '+/^%b %e %R:/p;'; done ; echo d)"
于 2013-11-05T01:19:11.803 回答
0

所以它并没有真正适用于上述方法但我想我让它工作了

如果我看到这个,我为 {exit} 添加了一个范围

awk '/'"$dtnow"'/,/'"$dt6min"'/ { print } /'"$dt7min"'/,/'"$dt11min"'/ {exit}'

似乎可以再次测试它

于 2013-10-31T23:49:56.800 回答
0

如果日志条目从“5 月 14 日 11:41”开始,它将起作用。变量 LASTMINUTES 用于设置日志中的最后 n 分钟:

cat log | awk 'BEGIN{ LASTMINUTES=30; for (L=0;L<=LASTMINUTES;L++) TAB[strftime("%b %d %H:%M",systime()-L*60)] } { if (substr($0,0,12) in TAB) print $0 }'
于 2015-05-14T10:01:53.070 回答
0

要运行上面的脚本,您需要 gawk 可以通过以下方式安装:

apt-get install gawk

或者

yum install gawk
于 2015-10-30T20:53:34.760 回答