我想编写一个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/

10-10 17:49