awk:过滤字符串+计数行数?

awk:过滤字符串+计数行数?

我有一些 JSON 数据:

    "Item1": {
      "foo": null,
      "version": "bar",
      "result": null,
    },
    "Item2": {
      "foo": null,
      "version": "bar",
      "result": null,
    },
    "Item3": {
      "foo": null,
      "version": "bar",
      "result": null,
    },

awk可以过滤字符串:

$ awk '/version/' /tmp/json
      "version": "bar",
      "version": "bar",
      "version": "bar",

我正在尝试计算行数并在没有管道的情况下获得以下结果,纯 awk。

$ awk '/version/' /tmp/json | wc -l
3

在线示例展示了如何使用ENDandNR但这不会产生我正在寻找的结果:

$ awk '/version/{print NR}' /tmp/json
3
8
13

或者

$ awk 'END/version/{print NR}' /tmp/json
awk: line 1: syntax error at or near /version/

答案1

如果您确实坚持在 中执行此操作awk,那么您所需要做的就是为每个匹配行增加一个变量,然后在处理完所有行后,打印该变量:

$ awk '/version/{c++}END{print c}' file
3

或者,如果您想0在没有匹配项时打印(上面将只打印一个空行),请使用:

awk '/version/{c++}END{print c+0}' file

终于可以打印了仅有的如果至少有一个匹配项(因此没有输出,而不是空行,当没有匹配项时),请使用:

awk '/version/{c++}END{ if(c) print c}' 

答案2

awk 'BEGIN { count=0 } /version/ { count++ } END { printf( "%d\n", count ) }' datafile.json

但是,更简单地说:

grep -c 'version' datafile.json

相关内容