【问题标题】:Output specific part for each block输出每个块的特定部分
【发布时间】:2021-03-03 00:39:13
【问题描述】:

我有一个由 jq 解析的 json,但我需要遍历每个块并获取名称和 lastModified 然后存储它们,以便我可以删除比特定日期更早的 zip 文件。对于这个例子,假设 2020-06-25 是一个“旧包” 所以我们有 da-editor-user-groups-1.7.0.zip 和 lastModified 2020-06-25 我需要使用 jq 的 lastModified 属性按所有此类包过滤它

{
    "success": true,
    "results": 6,
    "total": 6,
    "more": false,
    "offset": 0,
    "hits": [
        {
            "path": "/etc/packages/com.change.aem.platform/change-editor-user-accounts-1.3.0.zip",
            "excerpt": "/etc/packages/com.change.aem.platform/change-editor-user-accounts-1.3.0.zip",
            "name": "change-editor-user-accounts-1.3.0.zip",
            "title": "change-editor-user-accounts-1.3.0.zip",
            "lastModified": "2020-06-25 17:50:12",
            "created": "2020-06-25 17:50:12",
            "size": "36 KB",
            "mimeType": "application/zip"
        },
        {
            "path": "/etc/packages/com.change.aem.platform/change-editor-user-accounts-1.3.0.zip/jcr:content/vlt:definition/thumbnail.png",
            "excerpt": "/etc/packages/com.change.aem.platform/change-editor-user-accounts-1.3.0.zip/jcr:content/vlt:definition/thumbnail.png",
            "name": "thumbnail.png",
            "title": "thumbnail.png",
            "lastModified": "2020-06-25 17:50:13",
            "created": "2020-06-25 17:50:13",
            "size": "2 KB",
            "mimeType": "image/png"
        },
        {
            "path": "/etc/packages/com.change.aem.platform/.snapshot/change-editor-user-accounts-1.3.0.zip",
            "excerpt": "/etc/packages/com.change.aem.platform/.snapshot/change-editor-user-accounts-1.3.0.zip",
            "name": "change-editor-user-accounts-1.3.0.zip",
            "title": "change-editor-user-accounts-1.3.0.zip",
            "lastModified": "2020-06-25 17:50:13",
            "created": "2020-06-25 17:50:13",
            "size": "7 KB",
            "mimeType": "application/zip"
        },
        {
            "path": "/etc/packages/com.change.aem.platform/.snapshot/change-editor-user-groups-1.7.0.zip",
            "excerpt": "/etc/packages/com.change.aem.platform/.snapshot/change-editor-user-groups-1.7.0.zip",
            "name": "change-editor-user-groups-1.7.0.zip",
            "title": "change-editor-user-groups-1.7.0.zip",
            "lastModified": "2020-06-25 17:50:13",
            "created": "2020-06-25 17:50:13",
            "size": "12 KB",
            "mimeType": "application/zip"
        },
        {
            "path": "/etc/packages/com.change.aem.platform/change-editor-user-groups-1.7.0.zip",
            "excerpt": "/etc/packages/com.change.aem.platform/change-editor-user-groups-1.7.0.zip",
            "name": "change-editor-user-groups-1.7.0.zip",
            "title": "change-editor-user-groups-1.7.0.zip",
            "lastModified": "2020-06-25 17:50:13",
            "created": "2020-06-25 17:50:13",
            "size": "31 KB",
            "mimeType": "application/zip"
        },
        {
            "path": "/etc/packages/com.change.aem.platform/change-editor-user-groups-1.7.0.zip/jcr:content/vlt:definition/thumbnail.png",
            "excerpt": "/etc/packages/com.change.aem.platform/change-editor-user-groups-1.7.0.zip/jcr:content/vlt:definition/thumbnail.png",
            "name": "thumbnail.png",
            "title": "thumbnail.png",
            "lastModified": "2020-06-25 17:50:13",
            "created": "2020-06-25 17:50:13",
            "size": "2 KB",
            "mimeType": "image/png"
        }
]
}

问题是如何创建一个循环来首先检查给定块的内容

【问题讨论】:

  • 请遵循minimal reproducible example 准则。什么是“老”?你试过什么?你为什么使用curl 标签?
  • 添加了更多信息。希望它更容易理解,是的,我使用了 curl
  • 您显示的 JSON 的 sn-p 本身不是有效的 JSON。根据minimal reproducible example 指导方针,请提供一个 mcve - 输入和预期(在这种情况下,可能是中间)输出。
  • 怎么无效。我从输出中复制了它?
  • 我更新了完整的输出

标签: json linux curl jq


【解决方案1】:

基于所提供示例的 jq 语句,您可以将输出通过管道传输到 awk 以进行日期比较并生成所需的命令。

cat file | jq -r '.hits[] | .lastModified + ";" + .name' | awk -v compdat="2020-11-20 13:13:45" -F\; '
    
      BEGIN { 
              "date -d \""compdat"\" +%s" | getline csdat 
            } 
      $2 ~ /zip$/ { 
               split($1,dats," ");
               "date -d \""$1"\" +%s" | getline sdat;
               if (sdat < csdat) { 
                                   print "rm "$2 
               } 
             }'

一个班轮:

cat file | jq -r '.hits[] | .lastModified + ";" + .name' | awk -v compdat="2020-05-20 13:13:45" -F\; 'BEGIN { "date -d \""compdat"\" +%s" | getline csdat } $2 ~ /zip$/ { split($1,dats," ");"date -d \""$1"\" +%s" | getline sdat;if (sdat < csdat) { print "rm "$2 } }'

在开始块中,我们使用 awk 的 getline 以纪元格式生成传递的日期 (compdat),将 date 命令的结果传递到变量 csdat。然后我们采取;逗号分隔变量 ($1 - lastModified, $2 - name) 并再次获取 lastModified 的纪元版本,将结果读入变量 csdat。然后,我们将 csdat 与 sdat 进行比较,如果 sdat 小于 csdat,则为 zip 文件打印 rm 命令。

一旦您确认命令按预期显示(这部分很重要!),您可以利用 awk 的系统函数运行实际命令,替换系统函数的打印等等:

cat file | jq -r '.hits[] | .lastModified + ";" + .name' | awk -v compdat="2020-05-20 13:13:45" -F\; 'BEGIN { "date -d \""compdat"\" +%s" | getline csdat } $2 ~ /zip$/ { split($1,dats," ");"date -d \""$1"\" +%s" | getline sdat;if (sdat < csdat) { system("rm "$2) } }'

【讨论】:

  • 我正在尝试使用 curl 但我得到 jq: error (at :0): Cannot index boolean with string "lastModified"
  • 需要先把json整理出来。我不确定它是否属于更大的数据子集?
  • 我必须在每个 {......} 之后取出逗号,才能最初让 json 正确解析。
  • 所以在做 curl 的时候我应该把它输出到一个文件然后去掉逗号?
  • 我已经根据您更新的 json 修改了解决方案。另外请不要因为您在问题中仅概述了 zip 文件,所以我对 png 文件的条目进行了折扣。
【解决方案2】:

jq 无法执行“rm”命令,但假设您在 bash 或类似 bash 的环境中运行 jq,您可以按照以下建议进行操作:

jq '.hits[] | select( .lastModified[:10] <= "2020-06-25") | .name' | 
  while read -r f ; do
    echo rm "$f"         # `echo` for testing
  done   

这当然假设 .lastModified 字段以日期的 YYYY-MM-DD 形式开始。如果其中任何一个假设不正确,您可以相应地调整上述内容。

【讨论】:

  • 由于某种原因我得到 jq: error (at :0): Cannot index boolean with string "lastModified"
  • 有效!! lastModified[:10] 是什么意思
  • 它采用 lastModified 键的前 10 个字符,即没有时间的日期
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 2020-11-04
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多