Shell 用通配符grep并计算匹配的行数
我将从后端访问日志统计生产API的使用情况,访问日志如下所示-Shell 用通配符grep并计算匹配的行数,shell,grep,sh,wildcard,Shell,Grep,Sh,Wildcard,我将从后端访问日志统计生产API的使用情况,访问日志如下所示- "GET /service1/api1?querystr1=11.." "GET /service1/api2?querystr2=22.." "GET /service1/api2?querystrx=xx.." "GET /service1/api3?querystry=zz.." "GET /service1/api3?querystr1=33.." "GET /service1/api3?querystr3=55.." 因
"GET /service1/api1?querystr1=11.."
"GET /service1/api2?querystr2=22.."
"GET /service1/api2?querystrx=xx.."
"GET /service1/api3?querystry=zz.."
"GET /service1/api3?querystr1=33.."
"GET /service1/api3?querystr3=55.."
因此,搜索的预期结果是:
/service1/api1 - 1
/service1/api2 - 2
/service1/api3 - 3
我知道使用以下命令可以获得所有Service1URL,但我不知道如何计算API中匹配字符串的数量
egrep '"GET /service1/.*' myaccesslogs
谢谢你的帮助
让我再补充一个问题: 日志: 条件:
grep -o /service1/first.do?action=doTask&.*&
expect: /service1/first.do?action=doTask&type=taskA
actual: /service1/first.do?action=doTask&type=taskA&xx=yy&zz=dd&
我试过:
egrep -o /service1/first.do?action=doTask&.*?&
但没有匹配的,看起来不贪婪(懒惰)对我不起作用。那么正确的条件是什么呢
答:添加-p非常有效
grep -Po /service1/first.do?action=doTask&.*?&
grep的-o参数确保只打印匹配项。然后我们对其进行排序,使所有API都是连续的,因为如果它们不连续,uniq将单独处理它们。uniq-c打印连续唯一条目的计数和条目
cat my.log | grep -o "GET /service1/api." | sort | uniq -c
输出
1 GET /service1/api1
2 GET /service1/api2
3 GET /service1/api3
试着像这样使用wc命令: egrep'GET/service1/*'myaccesslogs|wc-l尝试以下命令
$ sed 's/"\(.*\)?.*/\1/g' file | awk '{count[$2]++} END{ for (ct in count) { print ct," - ",count[ct]}}'
/service1/api1 - 1
/service1/api2 - 2
/service1/api3 - 3
-1这将与
egrep-c''GET/service1/'myaccesslogs
Hi Avinash执行相同的操作,感谢您的命令。正如我所测试的,您的命令对我的问题非常有效,我的实际案例比示例日志要复杂一些,无论如何,谢谢!
$ sed 's/"\(.*\)?.*/\1/g' file | awk '{count[$2]++} END{ for (ct in count) { print ct," - ",count[ct]}}'
/service1/api1 - 1
/service1/api2 - 2
/service1/api3 - 3