需要使用grep / egrep计算2000到2500之间的延迟范围, 考虑日志文件中的所有内容。
我尝试了以下内容:
Zgrep "/Api1\|Api2" log.gz|grep '"latency":[2000-2500]'|wc -l
但随机计数。
"Api1":"some", "latency":1000,
"Api1":"some", "latency":1000,
"Api2":"some", "latency":1000,
"Api1":"some", "latency":1000,
"Api2":"some", "latency":2100,
"Api1":"some", "latency":2400,
"Api2":"some", "latency":2400,
"Api1":"some", "latency":2500
输出:
count 4
"Api2":"some", "latency":2100,
"Api1":"some", "latency":2400,
"Api2":"some", "latency":2400,
"Api1":"some", "latency":2500
答案 0 :(得分:4)
尝试:
grep -E '"latency":(2[0-4][0-9][0-9]|2500)'
2[0-4][0-9][0-9]
部分匹配2
千,0
到4
数百的任意数字以及数十和单位的任何值(00
到{{ 1}})。
99
部分当然只匹配值2500
。
使用2500
合并两个,这意味着"交替":任一部分都可以匹配。围绕它们的括号需要限制交替元字符的范围。如果没有括号,我们需要在|
之后复制"latency":
部分;否则|
也可以在其他情境中匹配。
在您发布的代码中,2500
的输出会发送到grep
以计算找到的行数。 wc -l
可以为您计算并返回计数而不是匹配的行:
grep -c
字符类grep -c -E '"latency":(2[0-4][0-9][0-9]|2500)'
匹配方括号之间没有特殊含义的任何字符。
在字符类([2000-2500]
)中,有几个具有特殊含义的字符:
[...]
,只有当它是字符类中的第一个字符时,才会否定字符串的含义;它意味着"班级中任何不存在的字符&#34 ;;如果你需要它代表自己,那就不要把它作为班上的第一个角色; ^
,仅当不是字符类中的第一个或最后一个字符时,它才用于指定范围。在您的情况下,-
表示" 0-2
和0
"之间和之间的任何字符; 2
与[0-2]
(或[012]
或[201]
等相同,因为字符类中的字符顺序并不重要);如果你需要它来表示自己,那么把它放在第一个([120]
之后,如果它是一个否定的类)或该类中的最后一个字符; ^
用于关闭课程;如果你需要它来代表自己,那么使用]
来逃避它。总而言之,\
与[2000-2500]
相同,并且与[0125]
,0
,1
或2
相匹配。
答案 1 :(得分:2)
哟可以使用awk
awk -F, '{ for (i=1;i<=NF;i++) { if ( $i ~ /latency/ ) { split($i,arry,":");if ( arry[2] >= 2000 && arry[2] <= 2500 ) { print $0;cnt++ } } } } END { print "Count "cnt }' filename
将文件名中的每一行与分隔符“,”分开,然后循环查看文本“latency”的每个字段,并使用“:”将结果分成第二个字段,将结果放入数组“arry”然后我们专注于第二个元素“arry [2]”并检查它是否在2000和2500之间。如果是,则将变量“cnt”递增1.我们最后打印cnt。