【问题标题】:how to extract substring and numbers only using grep/sed如何仅使用 grep/sed 提取子字符串和数字
【发布时间】:2013-03-12 20:27:46
【问题描述】:

我有一个包含文本和数字的文本文件,我想使用 grep 仅提取我需要的数字,例如,给定一个文件如下:

miss rate 0.21  
ipc 222  
stalls n shdmem 112

假设我只想提取miss rate 的数据,即0.21。我如何使用 grep 或 sed 执行此操作?另外,我需要多个号码,而不仅仅是miss rate 之后的号码。也就是说,我可能想同时获得0.21112。示例输出可能如下所示:

0.21 222 112

因为我需要数据用于以后的绘图。

【问题讨论】:

  • 如果适合你,我建议使用 sed 而不是 grep
  • sed 如果在这种情况下工作得更优雅,也是可以接受的。

标签: regex linux bash sed


【解决方案1】:

改用awk

awk '/^miss rate/ { print $3 }' yourfile

要仅使用 grep,您需要非标准扩展,例如使用 GNU grep 的非标准扩展,使用 PCRE (-P) 和正向后向 (?

grep -Po '(?<=miss rate ).*' yourfile

【讨论】:

    【解决方案2】:

    如果你真的想只使用grep,那么你可以试试:

    grep "miss rate" file | grep -oe '\([0-9.]*\)'
    

    它会首先找到匹配的行,然后只输出数字。

    不过,Sed 可能更具可读性:

    sed -n 's#miss rate ##p' file
    

    【讨论】:

      【解决方案3】:

      使用特殊的环顾正则表达式技巧\K引擎和

      grep -oP 'miss rate \K.*' file.txt
      

      perl -lne 'print $& if /miss rate \K.*/' file.txt
      

      【讨论】:

      • 添加 Perl 可移植解决方案 =)
      • \K 技巧真的很有帮助。是的,我更喜欢 grep 这样做,因为我不是 awk 专家,而且 awk 的问题是字段分隔符,因为单个字段中的文本可以有多个不同的#spaces,如“miss rate XX”和“stalls total”第 XXX' 号
      【解决方案4】:

      grep-and-cut 解决方案如下所示:

      为每次成功使用 grep 获取第三个字段:

      grep "^miss rate " yourfile | cut -d ' ' -f 3
      

      或获取第三个字段,其余使用:

      grep "^miss rate " yourfile | cut -d ' ' -f 3-
      

      或者,如果您使用 bash 并且“未命中率”仅在您的文件中出现一次,您也可以这样做:

      a=( $(grep -m 1 "miss rate" yourfile) )
      echo ${a[2]}
      

      ${a[2]} 是你的结果。

      如果“未命中率”发生得更多,那么您可以循环遍历 grep 输出,只读取您需要的内容。 (在 bash 中)

      【讨论】:

        【解决方案5】:

        你可以使用:

        grep -P "miss rate \d+(\.\d+)?" file.txt
        

        或:

        grep -E "miss rate [0-9]+(\.[0-9]+)?"
        

        这两个命令都会打印出miss rate 0.21。如果您只想提取数字,为什么不使用 Perl、Sed 或 Awk?

        如果你真的想避免这些,也许这会起作用?

        grep -E "miss rate [0-9]+(\.[0-9]+)?" g | xargs basename | tail -n 1
        

        【讨论】:

          【解决方案6】:

          我相信

          sed 's|[^0-9]*\([0-9\.]*\)|\1 |g' fiilename

          会成功的。但是,如果可以的话,每个条目都将在它自己的行上。我确信 sed 有办法生成逗号或空格分隔的列表,但我不是 sed 的所有事物的超级大师。

          【讨论】:

          • 我通过 ([0-9][0-9][0-9][0- 9][0-9]) 作为捕获组。
          猜你喜欢
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-31
          • 1970-01-01
          • 2014-01-13
          • 2018-02-24
          相关资源
          最近更新 更多