gpt4 book ai didi

linux - 用于从文件中搜索字符串并显示每小时实例数的 Shell 脚本

转载 作者:太空宇宙 更新时间:2023-11-04 11:08:07 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com