需要在bash中计算2000-2500之间的数值范围

时间:2017-07-21 10:12:00

标签: regex bash unix grep

需要使用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

2 个答案:

答案 0 :(得分:4)

尝试:

grep -E '"latency":(2[0-4][0-9][0-9]|2500)'

2[0-4][0-9][0-9]部分匹配2千,04数百的任意数字以及数十和单位的任何值(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-20"之间和之间的任何字符; 2[0-2](或[012][201]等相同,因为字符类中的字符顺序并不重要);如果你需要它来表示自己,那么把它放在第一个([120]之后,如果它是一个否定的类)或该类中的最后一个字符;
  • ^用于关闭课程;如果你需要它来代表自己,那么使用]来逃避它。

总而言之,\[2000-2500]相同,并且与[0125]012相匹配。

答案 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。