将 json 对象解析为 linux 中的列

Parse json object to column in linux

我有一个 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'

这个国家和城市列的输出应该添加到下面另一个 csv 文件示例的第 4 和第 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
$ cat tst.awk
BEGIN { FS="\": \""; OFS="\t" }
{ gsub(/^"|",$/,""); f[] =  }
/}/ { print f["country"], f["city"]; delete f }

$ awk -f tst.awk file
CN      Beijing

由于您没有提供 "other file" 来添加此输出或提供有关如何执行此操作的任何详细信息,因此不清楚您要用它做什么,所以留给你...

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

你可以先把你感兴趣的两个字段放到一个数组中:

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

然后使用 @csv:

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

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

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

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