我需要一个grep命令的帮助:
grep match-word tomcat-0.log.* | grep "TOMCAT BENCH" | grep -v Normal
目前的输出类似于:
tomcat-0.log:TOMCAT BENCH: match_word random-text 1420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
我想修改它以仅显示经过值大于3000
单词elapsed
始终存在且数字为之前的单词 elapsed
。
是否可以修改grep
命令来过滤上一个字并将其与数字进行比较?
答案 0 :(得分:5)
使用gnu awk可以在一个命令中完成:
awk '/TOMCAT BENCH/ && !/Normal/ && match($0, / ([0-9]+) elapsed /, a) && a[1] > 3000' tomcat-0.log.*
答案 1 :(得分:4)
保持简单,您只需要:
zcat file |
awk -F ' *elapsed.*' '/TOMCAT BENCH/ && !/Normal/{n=$1;sub(/.* /,"",n)} n>3000'
e.g。与您发布的一行示例输入:
$ cat file |
awk -F ' *elapsed.*' '/TOMCAT BENCH/ && !/Normal/{n=$1;sub(/.* /,"",n)} n>1400'
tomcat-0.log:TOMCAT BENCH: match_word random-text 1420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
答案 2 :(得分:2)
正如所要求的那样,这里是一个全部grep
解决方案,它的所有蛮力荣耀:
... | grep -E "([1-9][0-9]{4,}|3[0-9]{2}[1-9]|3[0-9][1-9]0|[4-9][0-9]{3}) elapsed"
让我们通过这个解决方案:
[1-9][0-9]{4,}
匹配任何大于9999的数字。基本上,它会验证我们的数字字符串中ten thousands place, 100 thousands place, ...
或更高的数字是否大于0。
例如,12000
会匹配,但02000
将不匹配。 3[0-9]{2}[1-9]
匹配 NOT 以零结尾的所有数字3001 - 3999
3[0-9][1-9]0
匹配3010, 3120, 3990, etc.
等以零结尾但不小于或等于3000的数字[4-9][0-9]{3}
匹配大于3999
如果匹配上述模式之一,我们确保紧跟着字符串&#34;过去,&#34;在这种情况下,我们已经完成了。
PS:请记住,我们必须匹配大于 3000的数字。
PPS:请注意,我假设之前的字符串是&#34;经过&#34;总是由数字组成;在检查号码之前,我不确定是否有空格。
PPPS:这是使用grep
完成的,因为它是要求解决方案的工具。我并不是说grep
是一个很好的方法......
PPPPS:由于正在搜索的日志格式,我不希望必须处理负数。因此,我不知道。 :)
答案 3 :(得分:1)
您可以按如下方式使用awk
命令:
awk '{for(i=1;i<=NF;i++){ if($i == "elapsed") { if ($(i-1) >3000 ) print; } }}' file
假设您的样本输入文件是
$ cat file
t-0.log:TOMCAT BENCH: match_word random-text 1420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 5420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 3100 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 0 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 6596 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
运行awk
命令生成
$ awk '{for(i=1;i<=NF;i++){ if($i == "elapsed") { if ($(i-1) >3000 ) print; } }}' file
t-0.log:TOMCAT BENCH: match_word random-text 5420 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 3100 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
t-0.log:TOMCAT BENCH: match_word random-text 6596 elapsed Thu 2016-09-22 06:31:04:928 PDT <SessionID: id> <RequestID: reqId>
答案 4 :(得分:0)
你只需要添加
| awk 'match($0, / ([0-9]+) elapsed /, a) && a[1] > 3000'
在命令的最后:
grep match_word tomcat-0.log.* | grep "TOMCAT BENCH" | grep -v Normal | awk 'match($0, / ([0-9]+) elapsed /, a) && a[1] > 3000'
答案 5 :(得分:0)
使用numgrep
:
... | grep elapsed | numgrep /3000../