![如何从curl JSON输出中提取特定值](https://linux22.com/image/207178/%E5%A6%82%E4%BD%95%E4%BB%8Ecurl%20JSON%E8%BE%93%E5%87%BA%E4%B8%AD%E6%8F%90%E5%8F%96%E7%89%B9%E5%AE%9A%E5%80%BC.png)
由于某些原因,我无法使用该jq
命令来解析curl
JSON 输出。
我需要使用标准 Unix 工具(如grep
、awk
、sed
等)提取某些字段。
输出示例curl
:
[
{
"case_id": 1500,
"date": "13:58 02-02-2021",
"user": "admin",
"ip": "1.2.3.4",
"type": "test",
"active": "true"
},
{
"case_id": 1501,
"date": "14:45 02-02-2021",
"user": "admin",
"ip": "1.2.3.5",
"type": "dev",
"active": "false"
}
]
ip
我需要一个正则表达式来提取字段和的值type
。
我需要提取纯ip 1.2.3.4
我需要同一行中的值,并用逗号分隔。例如:
1.2.3.4, test
1.2.3.5, dev
答案1
awk
解决方案。
$ awk -F\" '$2~/^(ip|type)$/{a=a$4","}END{print substr(a,0,length(a)-1)}' file.txt
1.2.3.4,test,1.2.3.5,dev
$
答案2
其他的另一种变化
jq -r '.[]| "\(.ip), \(.type)"' < jsonfile
答案3
如果格式始终如示例中所示,ip
一行接着type
一行,那么这sed
应该可以工作。
$ curl ... | sed -n '/ip\|type/{s/[^:]*: "\([^"]*\)"/\1/;N;s/\n[^:]*: "\([^"]*\).*/ \1/p};'
1.2.3.4, test
1.2.3.5, dev
如果它们有可能位于不同的行但ip
仍然出现在 之前type
,那么这种替代方案也应该有效。
$ curl ... | sed -n '/ip/{s/[^:]*: "\([^"]*\)"/\1/;h;d};/type/{s/[^:]*: "\([^"]*\).*/\1/;x;G;s/\n/ /p}'
1.2.3.4, test
1.2.3.5, dev
答案4
paste -d ',' <(grep -wE 'ip' INPUT | awk -F'"' '{ print $4 }') <(grep -wE 'type' INPUT | awk -F'"' '{ print $4 }')