【问题标题】:Extract value after patern via grep regex通过 grep 正则表达式在模式后提取值
【发布时间】:2018-11-14 06:18:13
【问题描述】:

我正在尝试使用 grep 通过正则表达式从字符串中检索值,问题是如何在找到表达式后获取值。就像在这个例子中一样:

tcp6   0    0   :::80   :::*     LISTEN     811/apache2

我可以简单地执行“[0-9]{2,}”得到值80,问题是我也匹配进程“811”的PID,我如何只得到“::”之后的数字:“?

【问题讨论】:

  • 为什么要使用 grep?

标签: regex shell grep


【解决方案1】:

假设 GNU grep:

$ s="tcp6   0    0   :::80   :::*     LISTEN     811/apache2"
$ grep -oP ':::\K\d+' <<<"$s"
80

【讨论】:

    【解决方案2】:

    关注awks 可能会对您有所帮助。

    解决方案 1: 最简单的一个将字段分隔符更改为 ::: 和空格,看看魔术。

    awk -F':::| +' '{print $5}' Input_file
    

    解决方案 2: 仅在第 4 列中使用 sub

    awk '{sub(/:+/,"",$4);print $4}'  Input_file
    

    解决方案 3: 使用 awkmatch 函数来匹配一行 3 个冒号和数字的正则表达式。

    awk 'match($0,/:::[0-9]+/){print substr($0,RSTART+3,RLENGTH-3)}'  Input_file
    

    解决方案 4: 在完整的一行中使用多个 subs 以获得预期的输出。

    awk '{sub(/[^:]*/,"");sub(/:::/,"");sub(/ +.*/,"");print}'  Input_file
    

    注意:如果您使用的是显示输出的命令,那么尽管使用 awk.... Input_file,请使用 eg--> your_command | awk... for以上代码也是。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多