格式化json文件以添加另一个字段

时间:2015-03-17 20:05:00

标签: json bash awk sed jq

我有一个json文件,其格式如下所示。我想修改该文件,以便为其添加另一个键值对。密钥应为url,并且值应为www.mywebsite.co.nz从下面给出的消息中提取。什么是easiset方法呢?

{"  
Timestamp":"Mon Mar 16 21:37:22 EDT 2015","Event":"Reporting  Time","Message":"load for http://xxx.xx.xx.xx:1xxxx/operations&proxy=www.mywebsite.co.nz&send=https://xxx.xx.xx.xx:xxxx/operations?event took 9426 ms (X Time: 306 ms, Y Time: 1923 ms)
StatusCode: Unknown<br>Cookies: nzh_weatherlocation=12; dax_ppv=11|NZH:home|NZH:home|NZH:home|9|undefined; _ga=GA1.4.1415798036.1426208630; _gat=1<br>Links: 225<br>Images: 24<br>Forms: 10<br>Browser: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/41.0.2272.76 Chrome/41.0.2272.76 Safari/537.36<br>CPUs: 2<br>Language: en-GB","UserInfo":"Reporting Time"}

2 个答案:

答案 0 :(得分:2)

作为jqsed的组合:

jq ".url = \"$(jq '.Message' input.json | sed 's/.*proxy=\([^&]*\).*/\1/')\"" input.json > output.json

这包括三个步骤:

jq '.Message' input.json

从输入JSON中提取消息部分,

sed 's/.*proxy=\([^&]*\).*/\1/'

从邮件中提取域名,

jq ".url = \"domainname\"" input.json > output.json

将输入json的.url属性设置为提取的域名,并将结果写入output.json

顺便说一下,我觉得有必要指出一个域名本身在技术上并不是一个URL,所以你可能想重新考虑那个属性名称。

答案 1 :(得分:1)

对于perl个用户,请使用ojo

perl -Mojo -E '$j=j(b("input.file")->slurp);if($j->{Message}=~m/proxy=(.*?)&/){$j->{url}=$1;say j($j)}'

分解:

  • b()->slurp - 阅读input.file
  • j() - 将json转换为perl数据
  • 如果Message包含&#34; proxy = site&amp;&#34; - 获取网站
  • url => site
  • 添加到数据中
  • j()转换为json字符串
  • 并打印出来。