【问题标题】:cut part of grep output with sed用 sed 剪切部分 grep 输出
【发布时间】:2011-11-11 16:21:41
【问题描述】:

我需要从日志文件中获取值,值可能不同,需要获取。

字符串示例:

Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0

我尝试:

cat log.log | grep '^Test run:' | sed -e 's/^Test run: //'

但我得到: 1042,失败:0,错误:0,跳过:0

我需要 4 个结果类似于的命令

第一个命令(测试运行)

1042

第二条命令(失败)

0

第三条命令(错误)

0

第四个逗号(跳过)

0

【问题讨论】:

    标签: regex linux sed grep


    【解决方案1】:

    您可以使用以下四个命令分别获取Tests runFailuresErrorsSkipped的值:

    cat log.log | sed 's/Tests run: \([0-9]\+\).*/\1/g'
    cat log.log | sed 's/.*Failures: \([0-9]\+\).*/\1/g'
    cat log.log | sed 's/.*Errors: \([0-9]\+\).*/\1/g'
    cat log.log | sed 's/.*Skipped: \([0-9]\+\).*/\1/g'
    

    【讨论】:

      【解决方案2】:
      grep '^Tests run:' <<END | grep -o '[0-9]\+'
      Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0
      junk
      Tests run: 1, Failures: 2, Errors: 3, Skipped: 4
      END
      

      输出

      1042
      0
      0
      0
      1
      2
      3
      4
      

      【讨论】:

        【解决方案3】:

        我不确定这是否是您想要的,但假设您要搜索的行将采用以下格式:

        Tests run: <integer>, Failures: <integer>, Errors: <integer>, Skipped: <integer>
        

        以下可能对您有用:

        sed -e 's/^Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]\).*$/\1,\2,\3,\4/'
        

        在名为 test.log 的文件中给出以下输入

        Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0
        Tests run: 12, Failures: 0, Errors: 0, Skipped: 0
        Tests run: 104, Failures: 1, Errors: 3, Skipped: 4
        

        跑步:

        cat test.log | sed -e 's/^Tests run: \([0-9]*\), Failures: \([0-9]*\), Errors: \([0-9]*\), Skipped: \([0-9]\).*$/\1,\2,\3,\4/'
        

        将产生以下输出:

        1042,0,0,0
        12,0,0,0
        104,1,3,4
        

        当然,您可以通过使用 sed 表达式的 /\1,\2,\3,\4/ 部分来调整最终输出。

        【讨论】:

          【解决方案4】:

          类似这样的:

          sed -n "s/.*Tests run: \([0-9]*\),.*/\1/p"
          sed -n "s/.*Failures: \([0-9]*\),.*/\1/p"
          sed -n "s/.*Errors: \([0-9]*\),.*/\1/p"
          sed -n "s/.*Skipped: \([0-9]*\)$/\1/p"
          

          【讨论】:

            【解决方案5】:

            你的意思是这样的吗?

            sed -rn 's/^Tests run:\s*//;s/,[^:]+:\s*/\n/gp' log.log
            

            结果:

            1042
            0
            0
            0
            

            【讨论】:

              【解决方案6】:

              这可能对你有用:

              echo "Tests run: 1042, Failures: 0, Errors: 0, Skipped: 0" | 
              sed '/^Tests/{s/[^0-9,]//g;y/,/\n/;}'
              1042
              0
              0
              0
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-03-29
                • 2013-12-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多