如何从curl JSON输出中提取特定值

如何从curl JSON输出中提取特定值

由于某些原因,我无法使用该jq命令来解析curlJSON 输出。

我需要使用标准 Unix 工具(如grepawksed等)提取某些字段。

输出示例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 }')

相关内容