首页 > 解决方案 > 如果模式之间的值大于数字,则正则表达式打印行 - 与列位置无关的解决方案

问题描述

2001-06-30T11:33:33,543 DEBUG  (Bss-Thread-948:[]) SUNCA#44#77#CALMED#OK#58#NARDE#4356#68654768961#BHR#TST#DEV
2001-06-30T11:33:33,543 DEBUG  (Bss-Thread-948:[]) SUNCA#44#77#CALMED#OK#58#NARDE#89034#1234567#BHR#TST#DEV
2001-06-30T11:33:33,543 DEBUG  (Bss-Thread-948:[]) SUNCA#44#77#OK#58#BHREDD#234586#4254567#BHR#TST#DEV
2001-06-30T11:33:33,543 DEBUG  (Bss-Thread-948:[]) SUNCA#44#77#OK#58#NARDE#89034#1034567#BHR#TST#DEV

我有上面提到的日志文件。仅当模式 # 和 #BHR 之间的值大于 1100000 时,我才想打印行。

我可以在我的日志文件中看到值为 68654768961、1234567、4254567、1034567 的行。根据要求,输出应仅包含前 3 行。

我正在寻找正则表达式来获得所需的输出。

标签: shell

解决方案


一个问题,这#58#BHR应该在第三行忽略吗?如果是,我将在模式##BHR#.

通常,应该通过根据业务逻辑编写脚本来解决这个问题。但是您可以通过awk.

awk '{if (0 == system("[ $(echo \"" $0 "\"" " | grep -oP \"" "(?<=#)\\d+(?=#BHR#)\" || echo 0) -gt 1100000 ]")) {print $0}}' log_file

主要是通过以下system()方式来划伤值grep

# if can't get the pattern value by grep, the value will assign 0
echo $one_line | grep -oP "(?<=#)\d+(?=#BHR#)" || echo 0`

并将值与1100000in[ "$value" -gt 1100000 ]进行比较awk

仅供参考,所以如果value大于1100000它将返回0

system(cmd):执行 cmd 并返回其退出状态


推荐阅读