代码之家  ›  专栏  ›  技术社区  ›  TheJeff

在Bash中解析Jenkins作业的Karma覆盖率输出(脚本)

  •  2
  • TheJeff  · 技术社区  · 8 年前

    我正在处理以下输出:

    =============================== Coverage summary ===============================
    Statements   : 26.16% ( 1681/6425 )
    Branches     : 6.89% ( 119/1727 )
    Functions    : 23.82% ( 390/1637 )
    Lines        : 26.17% ( 1680/6420 )
    ================================================================================
    

    我想通过REGEX将4个不带百分比的覆盖率百分比解析为一个逗号分隔的列表。

    有什么好的正则表达式的建议吗?或者另一个好的选择?

    5 回复  |  直到 8 年前
        1
  •  2
  •   wp78de    8 年前

    我想这是一个 grep 工作。这应该有助于:

    $ grep -oE "[0-9]{1,2}\.[0-9]{2}" input.txt | xargs | tr " " ","
    

    输出:

    26.16,6.89,23.82,26.17
    

    输入文件只包含上面显示的内容。显然,还有其他方法 cat 输入到命令。

    说明:

    • grep -oE :仅使用扩展正则表达式显示匹配项
    • xargs :将所有结果放在一行上
    • tr " " "," :将空格转换为逗号:

    这实际上是一个很好的shell工具带示例。


    包括考虑 Joseph Quinsey ,可以使regex更加健壮,并使用lookahead断言 % 然后使用Perl兼容的重新模式对数值进行签名:

    grep -oP "[0-9]{1,2}\.[0-9]{2}(?=%)" input.txt | xargs | tr " " ","
    
        2
  •  3
  •   Joseph Quinsey Taseen    8 年前

    这个 sed 命令:

      sed -n '/ .*% /{s/.* \(.*\)% .*/\1/;p;}' input.txt | sed ':a;N;$!ba;s/\n/,/g'
    

    给出输出:

      26.16,6.89,23.82,26.17
    

    编辑: 一个更好的答案,只有一个 塞德 ,将是:

      sed -n '/ .*% /{s/.* \(.*\)% .*/\1/;H;};${g;s/\n/,/g;s/,//;p;}' input.txt
    

    说明:

    • / .*% / 搜索具有百分比值的行(注释空格)
    • s/.* \(.*\)% .*/\1/ 删除除百分比值以外的所有内容
    • H 然后将其附加到保留空间,并以换行符作为前缀

    • $ 最后一行

    • g 获得等待空间
    • s/\n/,/g 用逗号替换所有新行
    • s/,// 并删除初始逗号
    • p 最后输出结果

    要强化正则表达式,可以替换对百分比值的搜索 .*% 例如 [0-9.]*% .

        3
  •  2
  •   CWLiu    8 年前

    你会考虑用 awk ? 这是你可以尝试的命令,

    $ awk 'match($0,/[0-9.]*%/){s=(s=="")?"":s",";s=s substr($0,RSTART,RLENGTH-1)}END{print s}' file
    26.16,6.89,23.82,26.17
    

    简要说明,

    • match($0,/[0-9.]*%/) :查找与regex匹配的记录 [0-9.]*%
    • s=(s=="")?"":s"," :因为逗号分隔是必需的,所以我们只需要在每个匹配项之前打印逗号,第一个匹配项除外。
    • s=s substr($0,RSTART,RLENGTH-1) :打印附加到的匹配部分 s
        4
  •  1
  •   tshiono    8 年前

    假设项名称(语句、分支,…)不包含空白,那么:

    #!/bin/bash
    
    declare -a keys
    declare -a vaues
    
    while read -r line; do
        if [[ "$line" =~ ^([^\ ]+)\ *:\ *([0-9.]+)% ]]; then
            keys+=(${BASH_REMATCH[1]})
            values+=(${BASH_REMATCH[2]})
        fi
    done < output.txt
    
    ifsback=$IFS        # backup IFS
    IFS=,
    echo "${keys[*]}"
    echo "${values[*]}"
    IFS=$ifsback        # restore IFS
    

    结果是:

    Statements,Branches,Functions,Lines
    26.16,6.89,23.82,26.17
    
        5
  •  1
  •   Julio    8 年前

    还有另一个选择,perl:

    cat the_file | perl -e 'while(<>){/(\d+\.\d+)%/ and $x.="$1,"}chop $x; print $x;'
    

    代码,展开并解释:

    while(<>){  # Read line by line. Put lines into $_
      /(\d+\.\d+)%/ and $x.="$1,"
      # Equivalent to:
      # if ($_ =~ /(\d+\.\d+)%/) {$x.="$1,"}
      # The regex matches "numbers", "dot", "numbers" and "%", 
      # stores just numbers on $1 (first capturing group)
    }
    chop $x; # Remove extra ',' and print result
    print $x;
    

    稍微短一点,有一个额外的sed

    cat the_file | perl -ne '/(\d+\.\d+)%/ and print "$1,"'|sed 's/.$//'
    

    使用“n”参数,这意味着 while(<>){} . 为了去掉最后一个','我们使用sed。

    推荐文章