将json对象解析为linux中的列

时间:2016-04-05 14:04:16

标签: bash awk sed jq

我有一个json格式的输出,如下所示

{
"ip": "0.0.0.0",
"hostname": "No Hostname",
"city": "Beijing",
"region": "Beijing Shi",
"country": "CN",
"loc": "39.9289,116.3883",
"org": "AS55967 Beijing Baidu Netcom Science and Technology Co., Ltd."
}

我需要国家和城市的价值如下

CN        Beijing

我使用了以下jq命令和sed命令来显示国家但不知道如何将城市显示为另一列。

JQ

 curl  -s ipinfo.io/0.0.0.0 | jq '.country'

SED

 curl  -s ipinfo.io/0.0.0.0 | sed '/country/!d' | sed s/\"country\":\ //g | sed 's/\"//g' | sed 's/\,//g'

此国家/地区和城市列的输出应添加到第4和第4列。

下面另一个csv文件样本的第5列
2016-03-29 00:05:23 0.0.0.0 CN Beijing 10.0.0.197 
2016-03-29 00:56:37 1.1.1.1 FR France 10.0.1.117
2016-03-29 00:57:20 2.2.2.2 FR France 10.0.0.197

3 个答案:

答案 0 :(得分:1)

$ cat tst.awk
BEGIN { FS="\": \""; OFS="\t" }
{ gsub(/^"|",$/,""); f[$1] = $2 }
/}/ { print f["country"], f["city"]; delete f }

$ awk -f tst.awk file
CN      Beijing

由于您没有提供“其他文件”来添加此输出或提供有关您希望如何执行此操作的任何详细信息,因此不清楚您要对此做什么,所以它留给您。

答案 1 :(得分:1)

curl  -s ipinfo.io/0.0.0.0 | jq -r '.country +"\t"+  .city'

答案 2 :(得分:0)

您可以先将您感兴趣的两个字段添加到数组中:

$ curl -s ipinfo.io | jq '[.country, .city]'
[
  "US",
  "Mountain View"
]

然后使用@csv转换为csv:

$ curl -s ipinfo.io | jq '[.country, .city] | @csv'
"\"US\",\"Mountain View\""

-r(raw)参数清除了一些转义:

$ curl -s ipinfo.io | jq -r '[.country, .city] | @csv'
"US","Mountain View"

然后,您可以使用paste将输出与另一个文件合并。