我有一些 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
在线示例展示了如何使用END
andNR
但这不会产生我正在寻找的结果:
$ 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