使用shell从JSON文件中获取记录数

使用shell从JSON文件中获取记录数,shell,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", "s

我有一个这种格式的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。类似地,如果它有“demo-nos”:[692300],则计数将为2

那么,我可以编写什么shell脚本来获取和打印计数

根据标记[]内的值,输出应显示demo nos=1或2


i、 我的shell脚本中有一个变量,名为market_nos,它应该为我提供count

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

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

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

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

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

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

从命令行操作JSON数据的金标准是:


.demo\u nos
返回与对象中的
demo\u nos
键关联的值,该数组通过管道传输到
length
函数,该函数的作用显而易见。

从命令行操作JSON数据的金标准是:


.demo\u nos
返回与对象中的
demo\u nos
键相关联的值,该数组通过管道传输到
length
函数,该函数执行明显的操作。

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

$cat some.json
{
“用户”:“sthapa”,
“票”:“LIN-5867_3”,
“开工日期”:“2018-03-16”,
“结束日期”:“2018-03-16”,
“演示编号”:[692],
“服务名称”:[
“服务1”,
“服务2”,
“服务3”,
“服务4”,
“服务5”,
“服务6”,
“服务7”,
“服务8”,
“服务9”
]
}
$python-c'导入sys,json;打印(len(json.load(sys.stdin)[“demo_nos”])”
我假设您有python,文件是JSON:)

$cat some.json
{
“用户”:“sthapa”,
“票”:“LIN-5867_3”,
“开工日期”:“2018-03-16”,
“结束日期”:“2018-03-16”,
“演示编号”:[692],
“服务名称”:[
“服务1”,
“服务2”,
“服务3”,
“服务4”,
“服务5”,
“服务6”,
“服务7”,
“服务8”,
“服务9”
]
}
$python-c'导入sys,json;打印(len(json.load(sys.stdin)[“demo_nos”])”
您已经尝试过了吗?目前,我正在试图找到一种方法,将数据传输到我正在准备的另一个脚本中,因此任何建议都可能会有所帮助。“JSON格式的文本文件”也称为“JSON文件”;不需要冗长的措辞,因为所有JSON文件也是文本文件。顺便说一句,当
“demo_nos:
[692],
项不再在同一行上时,您可以评估哪些答案仍然有效,我也会尝试其他方法,让你知道……无论如何,谢谢你的回答!!你已经试过什么了吗?目前我正在想办法把数据放到我正在准备的另一个脚本中,所以任何建议都可能有用。“JSON格式的文本文件”也称为“JSON文件”;不需要冗长的措辞,因为所有JSON文件也是文本文件。顺便说一句,当
“demo_nos:
[692],
项不再在同一行上时,您可以评估哪些答案仍然有效,我也会尝试其他方法,让你知道……无论如何,谢谢你的回答!!当你运行它时,你会得到什么输出?你能解释一下这是做什么的吗?例如,当使用一个包含例如“demo_nos”的test.txt文件运行时,我会得到“3”:[6925554444]grep
grep
在demo_nos之前删除字符串,然后
cut
s在[]中获取部分,最后awk计算以“,”分隔的令牌好的,标签中的数据会不断变化,例如“dem_nos”:[1,2,3]……所以计数是3,可能是2或4或5,那么我们有没有办法只显示demo_nos.{$,$}文件数??我希望你能抓住我??你试过我的命令吗?是不是还不回你需要的东西?否则,您可以使用jq来遵循@Shawn answer(哦,上面的纯awk方法有点不合适;应该是
gawk'/demo\u nos/{print(split(gensub(/.*demo\u nos):\[([^]+)\].*/,“\\1”,“g”),arr));}'
来实际执行分割并返回计数)。当你运行它时,你会得到什么输出?你能解释一下这是怎么回事吗?例如,当我使用一个包含例如“demo_nos”的test.txt文件运行时,会得到“3”:[6925554444]grep
grep
在demo_nos之前删除字符串,然后
cut
s在[]中获取部分,最后awk计算以“,”分隔的令牌好的,标签中的数据会不断变化,例如“dem_nos”:[1,2,3]……所以计数是3,可能是2或4或5,那么我们有没有办法只显示demo_nos.{$,$}文件数??我希望你能抓住我??你试过我的命令吗?是不是还不回你需要的东西?否则,您可以使用jq来遵循@Shawn answer(哦,上面的纯awk方法有点不合适;应该是
gawk'/demo\u nos/{print(split(gensub(/.*demo\u nos):\[([^]+)\].*/,“\\1”,“g”),arr));}'
来实际执行分割并返回计数。同意,但是jq工具可能不可用/安装是的,它不是。我使用了上面的一行命令及其工作方式。然而,使用shell来完成所有这些工作非常繁忙,应该使用python…..无论如何,多亏了所有..A
$ 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