首页 > 解决方案 > 在模式匹配之间提取值

问题描述

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

解析的日志文件文本

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

我想25f25nmmb_2p5km.f 25 .conus.grib2中提取

尝试的代码

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

标签: regexparsingunixsed

解决方案


您可以使用

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+ 字符。

或者,您可以使用grepPCRE 模式,例如

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

细节

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

请参阅在线sedgrep演示


推荐阅读