如何解决如何在使用 jq 从基于 json 的 har 文件中进行选择时连接相同键的值
我正在尝试通过处理 .csv
(基于 JSON)文件生成 .har
文件。
我当前的命令是这样的(请注意,我需要在 upper、lower 和 Initcaps 中找到 ascii_downcase
作为名称):
cat "$har1".har | $jq -r '[ "Name","StartTime","Cache","Encoding","ECID","Method","Size","Time","Blocked","Send","Wait","Receive","Type" ],(.log.entries[] | [
.request.url,.startedDateTime,((.response.headers[] | select(.name | ascii_downcase == "cache-control").value) // ""),((.response.headers[] | select(.name | ascii_downcase == "content-encoding").value) // ""),((.response.headers[] | select(.name | ascii_downcase == "x-oracle-dms-ecid").value) // ""),.request.method,(if .response.bodySize == 0 then .response.content.size else .response.bodySize end),.time,.timings.blocked,.timings.send,.timings.wait,.timings.receive,._resourceType ]) | @csv' > "$har1".csv
导致响应出现问题的 har 片段是“Cache-Control”的多个条目,如下所示:
{
"name": "Cache-Control","value": "public"
},{
"name": "Cache-Control","value": "max-age=31536000"
},
在json的以下部分:
"response": {
"status": 200,"statusText": "OK","httpVersion": "HTTP/1.1","headers": [
{
"name": "Date","value": "Thu,06 May 2021 04:53:24 GMT"
},{
"name": "Server","value": "Oracle-HTTP-Server"
},{
"name": "X-XSS-Protection","value": "1; mode=block"
},
值可以是任何东西,所以不要硬编码任何东西。 .csv
中的当前结果类似于:
"public","max-age=31536000"
它们被分成 2 列。
"xx.js","2021-05-06T06:14:10.505Z","public","max-age=31536000","gzip"...
我需要得到这个:
"public;max-age=31536000"
以;
为分隔符,但在.csv
的同一列。
"xx.js","public;max-age=31536000","gzip"...
我尝试了 groups_by
、group_by
示例,但以某种方式出现错误。
oguz ismail 的建议有不相等的“(”和“)”。
我根据建议尝试使用各种组合,并意识到:
- 它仍然没有按照需要用“;”合并列到生成的 .csv 中的一列。
- 它在 .name 之前添加了 3 个空列,在 .name 之后添加了 6 个空列 | ascii_downcase ==“缓存控制”列。
原始代码:
((.response.headers[] | select(.name | ascii_downcase == "cache-control").value) // ""),Original response:
"xx.js","gzip",Expected response:
"xx.js",
第一次尝试:
((.response.headers[] | ([select(.name | ascii_downcase == "cache-control").value]) | join(";")) // ""),"xx.js","",
第二次尝试:
((.response.headers[] | [select(.name | ascii_downcase == "cache-control").value] | join(";")) // ""),"gzip"
第三次尝试:
((.response.headers[] | [(select(.name | ascii_downcase == "cache-control").value)] | join(";")) // ""),
解决方法
您的一般问题是 .response.headers[]
会产生多个结果,而您无法将这些结果收集到一个值中。您可以在表达式周围包裹一个数组构造,即 [.response.headers[]| <...more filters here> ]
,或者您可以使用 map
代替 []
运算符。
使用数组构造函数:
([.response.headers[] | select(.name | ascii_downcase == "cache-control").value] | join(";"))
使用地图:
(.response.headers | map(select(.name | ascii_downcase == "cache-control").value | join(";"))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。