如何仅提取大于阈值的值

如何仅提取大于阈值的值

我是 bash 脚本新手。有人可以帮我解决以下问题吗?我有一个日志文件,其输出如下所示。

我正在尝试 grep 查找 logDurationMillis>=950ms 的输出行

logAlias:Overall,logDurationMillis:382,logTimeStart:2019-07-24_15:30:06.075,logTimeStop:2019-07-24_15:30:06.107
logAlias:Overall,logDurationMillis:388,logTimeStart:2019-07-24_15:30:06.406,logTimeStop:2019-07-24_15:30:06.444
logAlias:Overall,logDurationMillis:545,logTimeStart:2019-07-24_15:30:06.583,logTimeStop:2019-07-24_15:30:06.638
logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660
logAlias:Overall,logDurationMillis:640,logTimeStart:2019-07-24_15:30:07.197,logTimeStop:2019-07-24_15:30:07.237
logAlias:Overall,logDurationMillis:934,logTimeStart:2019-07-24_15:30:07.474,logTimeStop:2019-07-24_15:30:07.508
logAlias:Overall,logDurationMillis:336,logTimeStart:2019-07-24_15:30:07.546,logTimeStop:2019-07-24_15:30:07.582

这些值始终位于第二个以逗号分隔的列中。

答案1

使用 awk:

  1. 如果您知道“logDurationMillis”是第二项:

    awk -F'[:,]' -v limit=950 '$4 >= limit' file
    
  2. 否则

    awk -F'[:,]' -v limit=950 '{
        for (i=1; i<NF; i+=2) 
            if ($i == "logDurationMillis" && $(i+1) >= limit) 
                print
    }' file
    

答案2

假设您的文件名为logFile,此命令将执行此操作:

egrep ',logDurationMillis:(9[5-9][0-9]|[1-9][0-9]{3,}),' logFile

答案3

另一个awk

awk -F':|,' '$4 > 950' file

印刷:

logAlias:Overall,logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599,logTimeStop:2019-07-24_15:30:06.660

更新(由于OP问题:)

您可以像这样重建字段:

awk -F':|,' '$4 > 950 {print $3 ":" $4 "," $5 ":" $6 ":" $7 ":" $8 }' file

印刷:

logDurationMillis:961,logTimeStart:2019-07-24_15:30:06.599

(可能有一种更简单的方法来连接字段 3-8,但您还需要重建不同的字段分隔符)

相关内容