如何使用条件awk /省略某些行

时间:2017-03-09 08:30:27

标签: awk sed grep

目标: 我想知道在运行我的测试套件时我有多少测试。

我试图获得以BDD样式编写的测试场景的总数,并在控制台中打印该数字。 所有测试文件都在./features目录中。有子目录(所以我需要递归搜索) 一些测试被评论(使用#)

Simple scenario looks like that:

  Scenario: blah-blah-blah
    Given blah
    When blah bloh
    Then bluh bluh

这非常简单,充当魅力: grep -r "^\s*Scenario:" ./features/ | wc -l

棘手的部分是可以进行具有"场景概要"关键词。在测试的底部,有一个带有示例的表格。 场景可能如下所示:

  Scenario Outline: blah
    Given blah <score>
    When bloh <performance>
    Then blah-bloh-bluh <completion>

    Examples:
      | score | performance | completion |
      | 4/4   | 100         | 50         |
      | 3/4   | 75          | 50         |
      | 4/4   | 100         | 5          |

在第一行我们有标题 - 我们不应该计算它们。所以,在这种情况下,我们有3个测试。 到目前为止,我已经完成了类似的事情:

find ./features -type f -exec sed -n -e '/Scenario Outline/,/Scenario/ p' {} + | grep \| | wc -l

不幸的是,有两个问题我无法弄清楚:

  1. 我们正在检查&#34; Scenario Outline&#34;之间存在的表格。和&#34;场景&#34;。我的解决方案不符合&#34; Scenario Outline&#34;是文件中的最后一个测试(没有更多场景,只有EOF)。
  2. 我用&#39; |&#39;计算每一行。无论表格有真实数据还是标题。
  3. 感谢您的一切建议!

1 个答案:

答案 0 :(得分:1)

我不确定管道是否可以出现在文件中的任何其他位置,但如果不是,则以下命令将在跳过第一行时计算以 Scenario 开头的所有行和所有表行。

find ./features -type f -print0 | \
   xargs -0 awk '/^\s*Scenario:/; /\|/ { if (intable) print; intable=1 } intable && $0 !~ /\|/ { intable=0 }' | \
   wc -l