grep命令用于查找小于数字的上一个单词

时间:2016-09-22 17:44:54

标签: regex linux shell awk grep

我需要一个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命令来过滤上一个字并将其与数字进行比较?

6 个答案:

答案 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
  • 的4位数字

如果匹配上述模式之一,我们确保紧跟着字符串&#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../