我试图在一些调试输出中获得一些琐碎的统计信息。
每条调试行的格式为(class name)(delimiter 1)(object ID)(delimiter 2)(method name)(delimiter 3)(log message)
我想统计一下来自哪些方法的行数。
本质上,如果每行都可以减少到(class name)(delimiter)(method name)
,我想知道在日志文件中出现了多少次减少。
我可以在Bash中运行什么命令进行计数?
(我是在macOS上用macports用GNU工具替换了大多数默认的BSD风格的工具。)
我可以用提取类名grep -o -E "^.*(delimiter 1)
,或用提取方法名grep -o -E "(delimiter 2).*(delimiter 3)"
,或者用突出显示两者grep --color=always -E "^.*(delimiter 1)|(delimiter 2).*(delimiter 3)"
。我一直在寻找一种方法来grep
只输出两个匹配项,然后可以进行| uniq -c
计数。
有没有一种方法可以grep
打印每行的两个匹配项,而不是仅打印一个匹配项或整行?
从本质上讲,它可以用
sed -r -n 's/(^.*)(delimiter 1)(.*)(delimiter 2)(.*)(delimiter 3)(.+$)/\1(delimiter)\5/p' <( command that generates debug logs ) | sort | uniq -c | sort -rn
(从这里改编)
.*
可能匹配太多;sed
是贪婪的,并且希望尽可能早地匹配,因此可能需要例如对定界符的取反(如果定界符不方便,可能会很复杂)^
到$
很重要,如果您的表达式与整个行不匹配sed
,则输出中将包含不匹配的部分sed
输出中发生的更多情况,例如,将end更改为/\1(delimiter)\5 -- \1\2\3\4\5\6\7/p
)sort
必须先运行,uniq -c
因为uniq -c
仅对连续相同行的运行进行计数,非连续相同行将获得单独的计数uniq -c
不能被替换,sort -u
因为sort -u
仅丢弃重复项不计入重复项sort
不一定要回答所问的问题本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句