如何计算bash中单词之后的所有数字

时间:2018-02-26 13:59:55

标签: bash awk sed grep

我有这样的xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<testsuites name="social_service_demo" time="0.583">
  <testsuite name="demo / generate_access_token" id="60ec54b9-d67b-4f51-a20d-9794c3a85269" tests="2" time="0.583">
    <error>
    </error>
    <testcase name="Token should be generated correctly, response is 200" time="0.583">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
    <testcase name="Returned JSON should contain access_token field" time="0.583">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
  </testsuite>
  <testsuite name="demo / get_most_commented_entities" id="12aa656d-a702-4fc6-878c-2e0fde08021e" tests="1" time="0">
    <error>
    </error>
    <testcase name="Response is 200" time="0">
      <failure type="AssertionFailure">
        <![CDATA[Failed 1 times.]]>
      </failure>
    </testcase>
  </testsuite>
</testsuites>

我需要计算排在tests字之后的数字,如下所示: <testsuite name="demo / generate_access_token" id="60ec5" tests="2" time="0.583">。 在这个例子中,我有两个这样的数字:2和1,所以我的输出应该是3.如何在Bash中执行此操作?用grep可以吗?

4 个答案:

答案 0 :(得分:5)

不要使用grepsed等来解析XML / HTML数据 - 它永远不会产生强大且可扩展的结果。
使用正确的XML / HTML处理器,例如 xmlstarlet

xmlstarlet sel -t -v 'sum(//testsuite[@tests]/@tests)' -n input.xml

输出:

3

答案 1 :(得分:1)

如果您有GNU grep(通常预安装在Linux但不是mac),您可以使用

awk '/tests=/{gsub(/.*=|"/,"",$(NF-1));sum+=$(NF-1)} END{print sum}'  Input_file

否则你可以使用

grep -Po 'tests="\K\d*(?=")' inputFile

这些命令将打印用grep -Eo 'tests="[0-9]*"' inputFile | grep -Eo '[0-9]*' 写的所有数字。要总结这些数字,您可以安装并使用tests="..."

numsum

答案 2 :(得分:0)

关注classes_1可能对您有帮助。

awk

答案 3 :(得分:0)

Sub CreateHyperlinks( _
    raHypers() As Range, _
    saSubaddresses() As String, _
    saScreentips() As String)

    Dim myRange As Range

    For Each myRange In raHypers
        ' your code
    Next myRange

End Sub

此命令从stdin读取文件,每行写一个数字到stdout。

说明

  • grep - find utility
  • -o - 只写匹配,而不是行
  • tests =“[0-9] *” - 匹配测试=“ anynumber
  • 第二个grep - 仅提取数字

您可以将其与grep -o 'tests="[0-9]*"'|grep -o '[0-9]*' 计算器结合使用以计算总和:

bc

如果您不想使用grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+|bc (有时不安装)并使用纯粹的bash计算(使用bcgrep),您可以使用{{1符号:

paste

如果您还没有$(($(...))),则可以使用echo $(($(grep -o 'tests="[0-9]*"'|grep -o '[0-9]*'|paste -sd+))) 替换它:

paste