我将从后端访问日志中计算生产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&.*?&
答案 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>