使用shell

时间:2019-02-01 13:01:39

标签: shell

我有一个采用这种格式的test.txt文件

{
 "user": "sthapa",
 "ticket": "LIN-5867_3",
 "start_date": "2018-03-16",
 "end_date": "2018-03-16",
 "demo_nos": [692],
 "service_names": [
    "service1",  
    "service2",
    "service3",
    "service4",
    "service5",
    "service6",
    "service7",
    "service8",
    "service9"

 ]
}

我需要寻找一个名为demo_nos的标签并提供计数。 例如,在上面的文件“ demo_nos”:[692]中,这意味着仅一个演示编号...同样,如果它具有“ demo_nos”:[692,300],则计数为2

那我可以写什么shell脚本来获取并打印计数?

根据标签[]中的值,输出应显示演示编号= 1或2。

即我的shell脚本中有一个名为market_nos的变量,应该给我计数

3 个答案:

答案 0 :(得分:1)

从命令行处理JSON数据的黄金标准是jq

$ jq '.demo_nos | length' test.txt
1

.demo_nos返回与对象中的demo_nos键关联的值,并将该数组通过管道传递到length函数,这很明显。

答案 1 :(得分:1)

我假设您有python并且文件是JSON:)

$ cat some.json
{
 "user": "sthapa",
 "ticket": "LIN-5867_3",
 "start_date": "2018-03-16",
 "end_date": "2018-03-16",
 "demo_nos": [692],
 "service_names": [
    "service1",  
    "service2",
    "service3",
    "service4",
    "service5",
    "service6",
    "service7",
    "service8",
    "service9"

 ]
}

$ python -c 'import sys,json; print(len(json.load(sys.stdin)["demo_nos"]))' < some.json
1

答案 2 :(得分:0)

这不是最优雅的解决方案,但是应该这样做

cat test.txt | grep -o -P 'demo_nos.{0,200}' | cut -d'[' -f2 | cut -d']' -f1 | awk -F',' '{ print NF }'

请注意,这是一种快速而肮脏的解决方案,将输入视为原始文本,而不考虑JSON结构。在特殊情况下,“ demo_nos”字符串也会出现在文件的其他位置,则上述命令的输出可能不正确。