【问题标题】:Extract multiple floating numbers from a line从一行中提取多个浮点数
【发布时间】:2016-01-18 09:34:16
【问题描述】:

我想从以下行中提取 timeTaken 值:

<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting.

我在grepawk 中使用以下命令:

grep -Po "Exception, Curl1-Time: \K(\d+.\d*)s. Curl2-Time: (\d+.\d+)" app.log | awk '{print $1 + $3}'

这个输出:4.167565

  1. 能否以更智能的方式完成,可能使用 sed 或任何其他方式 bash 工具。
  2. 是否可以忽略尾随的“s”。在时间上 加法后的值是正确的。

【问题讨论】:

    标签: linux bash awk grep


    【解决方案1】:

    您已经在使用 PCRE。为什么不使用 Perl 本身?

    perl -lne 'print $1 + $2
               if /Exception, Curl1-Time: ([\d.]+)s\. Curl2-Time: ([\d.]+)/
              ' < input
    

    【讨论】:

      【解决方案2】:

      如果你有 GNU 的grep,那么你可以执行:

      var="<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting."
      grep -Eo '[[:digit:]]+\.[[:digit:]]+s?' <<< "$var"
      

      或者你可以使用awk并保持POSIX

      var="<some other log data> Exception, Curl1-Time: 0.258315s. Curl2-Time: 3.9092588424683s Exiting."
      awk '{ while (match($0, /[[:digit:]]+\.[[:digit:]]+s?/)) { print substr($0, RSTART, RLENGTH); $0 = substr($0, RSTART + RLENGTH) } }' <<< "$var"
      

      如您所见,这两个命令都使用正则表达式[[:digit:]]+\.[[:digit:]]+s? 来匹配一个或多个数字、一个点、一个或多个数字和一个可选's'的模式。

      GNU 的 grep 使用 -o 选项来提取匹配的正则表达式模式。

      awk 版本使用其matchsubstr 函数来匹配和提取相关数据。 正则表达式匹配后,RSTARTRLENGTH 被设置,我们可以使用它们来计算 substrstartend 位置。

      RLENGTHmatch函数匹配的子串的长度。

      RSTARTmatch 函数匹配的子字符串的起始索引。

      see section Built-in Functions for String Manipulation

      【讨论】:

        【解决方案3】:
        sed 's/.*Curl1-Time: \([0-9]\.[0-9]*\)s.*\([0-9]\.[0-9]*\)s.*$/\1 \2/p' filename | awk '{print ($1+$2);}'
        
        • 正则表达式模式匹配 ".Curl1-Time: ([0-9].[0-9])s.([0-9].[0-9])s.*$" ---> 大括号内的模式是匹配正则表达式的数字。
        • 整行替换为两个匹配的模式。即 sed 的输出将是两个数字,它们之间有空格。例如1234 34567
        • awk 使用默认空格分隔符解析 sed 输出并将它们相加并打印结果。

        【讨论】:

        • 简要说明这条线的作用对于试图了解您要解决的确切问题的人们非常有帮助。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-13
        • 1970-01-01
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多