微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在使用 jq 从基于 json 的 har 文件中进行选择时连接相同键的值

如何解决如何在使用 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_bygroup_by 示例,但以某种方式出现错误

oguz ismail 的建议有不相等的“(”和“)”。

我根据建议尝试使用各种组合,并意识到:

  1. 它仍然没有按照需要用“;”合并列到生成的 .csv 中的一列。
  2. 它在 .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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?