我想编写一个shell脚本来搜索字符串“/ABCDEFG/”,并从日志中打印的时间戳中获取特定日期的每小时计数。
下面是我需要从中获取计数的示例日志:
2014-06-21 00:00:22,516: |[http://123.123.123.123:15123/ABCDEFG/ [200] [REQUEST_STATUS,0;] [NO-ERROR] [134mSec]
2014-06-21 00:00:22,531: |[http://123.123.123.123:15123/ABCDEFG/ [200] [REQUEST_STATUS,0;] [NO-ERROR] [160mSec]
2014-06-21 23:59:54,920: |[http://123.123.123.123:15123/ABCDEFG/ [200] [REQUEST_STATUS,0;] [NO-ERROR] [149mSec]
2014-06-21 23:59:54,923: |[http://123.123.123.123:15123/ABCDEFG/ [200] [REQUEST_STATUS,0;] [NO-ERROR] [164mSec]
以下是可用于获取计数的手动命令:
grep "/ABCDEFG/" abc.log |grep "2014-06-21 00" | grep "[200]"|wc -l
grep "/ABCDEFG/" abc.log |grep "2014-06-21 01" | grep "[200]"|wc -l
grep "/ABCDEFG/" abc.log |grep "2014-06-21 03" | grep "[200]"|wc -l etc
最佳答案
这可能对你有用:
awk '$1 ~ /2014-06-21/ && $3 ~ /ABCDEFG/ && $4 == "[200]" {
++cnts[int(substr($2, 1, 2))]
}
END {
for(i = 0; i < 24; ++i)
printf("%02d: %4d\n", i, i in cnts ? cnts[i] : 0);
}
' logfile
你可以把它做成一个shell脚本。以下是1到3个参数。如果未提供第二个,则默认为“ABCDEFG”;如果未提供第三个,则默认为“logfile”。(显然,您可以更改这些默认值。)
#!/bin/sh
awk -vDATE="$1" -vSTR="${2:-ABCDEFG}" '
$1 ~ DATE && $3 ~ STR && $4 == "[200]" {
++cnts[int(substr($2, 1, 2))]
}
END {
for(i=0; i < 24; ++i)
printf("%02d: %6d\n", i, i in cnts ? cnts[i] : 0);
}
' ${3:-logfile}
假设它被称为
myscript
。您可以通过以下方式调用它:myscript 2014-06-21
myscript 2014-06-21 HIJKLMN
myscript 2014-06-21 ABCDEFG anotherlogfile
关于linux - Shell脚本可从文件中搜索字符串并显示每小时的实例数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24353631/