【问题标题】:Extract Values Between Pattern Match在模式匹配之间提取值
【发布时间】:2019-02-25 18:00:24
【问题描述】:

我正在尝试提取文本文件中模式匹配之间的任何数值。

解析的日志文件文本

> GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2

我想在 nmmb_2p5km.f25.conus.grib2

中从 f25 中提取 25

尝试的代码

sed -e 's/nmmb_2p5km\(.*\)grib2/\1/'

【问题讨论】:

    标签: regex parsing unix sed


    【解决方案1】:

    你可以使用

    log="GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2"
    sed 's/.*nmmb_2p5km[^0-9]*\([0-9]*\)[^0-9]*grib2.*/\1/' <<< "$log"
    

    .*nmmb_2p5km[^0-9]*\([0-9]*\)[^0-9]*grib2.* 模式匹配

    • .* - 任何 0+ 个字符
    • nmmb_2p5km - 文字子串
    • [^0-9]* - 0+ 个非数字字符
    • \([0-9]*\) - 捕获组 1(稍后在替换模式中使用 \1 引用):0+ 个数字
    • [^0-9]* - 0+ 个非数字字符
    • grib2.* - grib2 和任何 0+ 个字符。

    或者,您可以使用带有 PCRE 模式的 grep,例如

    grep -Po 'nmmb_2p5km\D*\K\d+' <<< "$log"
    

    详情

    • nmmb_2p5km - 文字子串
    • \D* - 0+ 个非数字字符
    • \K - 匹配重置操作员丢弃到目前为止匹配的所有文本
    • \d+ - 1 位以上。

    请参阅online sed and grep demo

    【讨论】:

    • PER。效果。感谢您非常彻底和完整的回答!
    【解决方案2】:

    使用 perl 单行代码

    > export log="GET /pub/data/nccf/com/hiresw/prod/hiresw.20180921/hiresw.t00z.nmmb_2p5km.f25.conus.grib2"
    > perl -ne ' BEGIN { $x=$ENV{log};$x=~s/(.+?)(\d+)\.conus\.(.+)/\2/g; print "$x\n"; exit } '
    25
    >
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-08
      • 2013-08-10
      • 2019-06-26
      相关资源
      最近更新 更多