【问题标题】:Parsing string with grep用 grep 解析字符串
【发布时间】:2011-12-28 12:11:31
【问题描述】:

我需要一些关于在 Linux 中解析字符串的帮助。

我有一个字符串:

[INFO] Total time: 2 minutes 8 seconds

只想得到

2 minutes 8 seconds

【问题讨论】:

  • 你真的读过man sed吗?
  • 我尝试使用 grep 但它是错误的
  • 是什么让您认为grep 是适合这项工作的工具?这是不是“只有锤子,什么都像钉子”?

标签: linux parsing sed grep


【解决方案1】:

sed 和 perl 选项确实有效,但在这种微不足道的情况下,我更喜欢

 echo "[INFO] Total time: 2 minutes 8 seconds" | cut -d: -f2

如果你有反对空格的东西,你可以使用

 echo "[INFO] Total time: 2 minutes 8 seconds" | cut -d: -f2 | xargs

甚至……

 echo "[INFO] Total time: 2 minutes 8 seconds" | cut -d: -f2 | cut -c2-

附言。琐事:只有当 grep 像 egrep -o '(?<=: ).*' 那样实现积极的后向观察时,您才能使用 grep 执行此操作;不幸的是,POSIX 扩展正则表达式和 GNU 扩展正则表达式都没有实现lookbehind (http://www.regular-expressions.info/refflavors.html)

【讨论】:

    【解决方案2】:

    使用grep

    $ echo '[INFO] Total time: 2 minutes 8 seconds' | grep -o '[[:digit:]].*$'
    2 minutes 8 seconds
    

    sed:

    $ echo '[INFO] Total time: 2 minutes 8 seconds' | sed 's/.*: //'
    2 minutes 8 seconds
    

    awk:

    $ echo '[INFO] Total time: 2 minutes 8 seconds' | awk -F': ' '{print $2}'
    2 minutes 8 seconds
    

    cut:

    $ echo '[INFO] Total time: 2 minutes 8 seconds' | cut -d: -f2
     2 minutes 8 seconds
    

    然后阅读sed & awk, Second Edition

    【讨论】:

      【解决方案3】:

      如果行前缀始终相同,只需使用 sed 并将前缀替换为空字符串:

      sed 's/\[INFO\] Total Time: //'
      

      假设时间始终是冒号后一行中的最后一项,请使用以下正则表达式(将每一行替换为冒号后的所有内容):

      sed 's/^.*: \(.*\)$/\1/'
      

      【讨论】:

        【解决方案4】:

        如果你更喜欢 AWK 那就很简单

        echo "[INFO] Total time: 2 minutes 8 seconds" | awk -F": " '{ print $2 }'
        

        【讨论】:

          【解决方案5】:

          使用sedperl

          echo "[INFO] Total time: 2 minutes 8 seconds" | sed -e 's/^\[INFO\] Total time:\s*//'
          echo "[INFO] Total time: 2 minutes 8 seconds" | perl -pe "s/^\[INFO\] Total time:\s*//;"
          

          【讨论】:

            【解决方案6】:

            如果您从终端获取信息,那么您可以 grep 出信息并使用带有分隔符的 cut 来删除您想要的信息之前的所有内容。 grep 信息 |剪切 -f2 -d:

            如果你想从文件中获取信息,那么你可以 grep 文件 grep INFO 一些文件名 |剪切 -f2 -d:

            【讨论】:

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