Shell 用通配符grep并计算匹配的行数

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.." 因

我将从后端访问日志统计生产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.."
因此,搜索的预期结果是:

/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