grep with wildcard并计算匹配的行数

时间:2014-05-04 07:54:47

标签: 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.."

所以搜索的期望结果是:

/service1/api1  - 1
/service1/api2  - 2
/service1/api3  - 3

我知道使用以下命令可以获取所有service1 URL,但我不知道如何计算匹配字符串的API。

egrep '"GET /service1/.*' myaccesslogs

感谢您的帮助。


让我添加一个后续问题:

记录:

/service1/first.do?action=doTask&type=taskA&xx=yy&zz=dd&

条件:

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&.*?&

3 个答案:

答案 0 :(得分:3)

grep的-o param确保只打印匹配。然后我们对它进行排序,所以像apis一样是连续的,因为如果不是,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

答案 1 :(得分:0)

尝试以下命令,

$ 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

答案 2 :(得分:-1)

尝试使用这样的wc命令:

egrep&#39;&#34; GET /service1/.*' myaccesslogs | wc -l <​​/ p>