2017-08-17 64 views
0

我正在处理脚本以便在用户提示时获取此日志的最后五分钟10:07:30。我该怎么做这个bash? Give是我脚本的一部分。在elb日志文件bash中获取过去5分钟的数据

2017-07-19T10:00:37.306805Z elb-sam30-ftpoc-prod 35.163.110.235:58814 10.0.2.203:80 0.000042 0.000579 0.00002 200 200 0 809 2017-07-19T10:01:56.572506Z elb-sam30-ftpoc-prod 35.163.110.235:58870 10.0.2.203:80 0.000038 0.000603 0.000019 200 200 0 809 2017-07-19T10:02:15.628179Z elb-sam30-ftpoc-prod 35.163.110.235:58904 10.0.2.203:80 0.000044 0.000583 0.00002 200 200 0 809 2017-07-19T10:03:34.875186Z elb-sam30-ftpoc-prod 35.163.110.235:58958 10.0.2.203:80 0.00004 0.000597 0.00002 200 200 0 809 2017-07-19T10:04:27.468370Z elb-sam30-ftpoc-prod 35.163.110.235:59400 10.0.2.203:80 0.000065 0.000513 0.000019 200 200 0 809 2017-07-19T10:05:46.601192Z elb-sam30-ftpoc-prod 35.163.110.235:59446 10.0.2.203:80 0.000057 0.000544 0.000021 200 200 0 809 2017-07-19T10:06:05.782121Z elb-sam30-ftpoc-prod 35.163.110.235:59492 10.0.2.203:80 0.000044 0.000667 0.00002 200 200 0 809 2017-07-19T10:07:24.983365Z elb-sam30-ftpoc-prod 35.163.110.235:59546 10.0.2.203:80 0.000041 0.000434 0.000019 200 200 0 809 2017-07-19T10:08:00.975682Z elb-sam30-ftpoc-prod 35.163.110.235:59794 10.0.2.203:80 0.000037 0.000521 0.000019 200 200 0 809 2017-07-19T10:09:20.152264Z elb-sam30-ftpoc-prod 35.163.110.235:59842 10.0.2.203:80 0.000045 0.000571 0.00002 200 200 0 809

+0

如果通过rsyslogd写入日志文件并且系统正在运行systemd,则可以使用带有--since标志的journalctl。 –

+0

这是一个外部日志文件 –

+0

所以你想在10:07:30(或任何用户输入)显示5分钟或更短的时间?那日期呢? –

回答

0
dat="Thu Aug 17 10:07:11 IST 2017" 
dat1=$(sed -rn 's/([[:alpha:]]{3}[[:blank:]][[:alpha:]]{3}[[:blank:]][[:digit:]]{2}[[:blank:]])(.*)(IST)(.*$)/\1\4 \2/p' <<< $dat) 
edat=$(date -d "$dat1" +%s) 
awk -v rdat=$edat '{ram1=substr($1,1,4)" "substr($1,6,2)" "substr($1,9,2)" "substr($1,12,2)" "substr($1,15,2)" "substr($1,18,2);ram1=mktime(ram1);ram=rdat-(60*5); if (ram1 >= ram) { print $0 } }' logfile 

AWK细分:

{  ram1=mktime(substr($1,1,4)" "substr($1,6,2)" "substr($1,9,2)" "substr($1,12,2)" "substr($1,15,2)" "substr($1,18,2)) 
     ram=rdat-(60*5) 
     if (ram1 >= ram) { 
       print $0 
     } 
} 

我们首先分析与SED的日期达到的格式的日期,那么我们可以通过命令日期让我们达到日期格式(自纪元以来的秒数)。然后将这个变量edat作为变量rdat传递给awk。这个日期减去了五分钟(60 * 5),然后在日志文件中的日期与mktime函数一起转换为纪元后与日期文件中的日期进行比较。

+0

谢谢你Ram的脚本。我不明白子串部分和它的值。你能否提供一些参考资料。 –

+0

substr($ 1,1,4)表示采用第一个空格分隔字段,即“2017-07-19T10:00:37.306805Z”,然后从第一个字段中提取4个字符。结果将是2017年。下一个substr命令是获取月份,然后是一天......等等。 –

+0

我试着执行脚本,但不能得到任何输出。如果可能,请您告诉步骤使用和调试脚本。 –

相关问题