You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JQ过滤排序证书数据并区分有效与过期证书?

分离过期与有效证书的Shell+JQ解决方案

不用拆分JSON再循环处理,直接用JQ一次性处理完整的证书列表,既能准确关联证书信息,又能按要求优先输出过期证书。

核心思路

利用JQ的日期处理和数组筛选能力:

  1. 将当前时间转为时间戳
  2. 把每个证书的expiryDate转为可对比的时间戳
  3. 按时间戳对比结果,将证书分成过期、有效两组
  4. 合并两组并优先输出过期证书

具体实现

假设你的证书JSON结构如下

{
  "certificates": [
    {
      "name": "服务器证书A",
      "id": "cert-001",
      "expiryDate": "2023-12-31T23:59:59Z"
    },
    {
      "name": "客户端证书B",
      "id": "cert-002",
      "expiryDate": "2025-06-30T23:59:59Z"
    }
  ]
}

基础版:输出合并后的JSON(过期证书在前)

# 获取当前时间戳
now=$(date +%s)

# 从文件读取JSON处理,若数据在变量$CERT_DATA中,可改为echo "$CERT_DATA" | jq ...
jq --arg now "$now" '
  # 定义日期转时间戳的函数(适配ISO8601格式)
  def to_timestamp: . | fromdateiso8601;
  
  .certificates |
  # 拆分过期/有效证书:第一个数组是过期的,第二个是有效的
  partition(.expiryDate | to_timestamp < ($now | tonumber)) |
  # 合并数组,过期证书优先
  .[0] + .[1]
' certificates.json

分组输出版:明确区分过期/有效证书

如果需要清晰的分组标题,可调整脚本输出结构化结果:

now=$(date +%s)

jq --arg now "$now" '
  def to_timestamp: . | fromdateiso8601;
  .certificates as $all_certs |
  {
    "过期证书": $all_certs | map(select(.expiryDate | to_timestamp < ($now | tonumber))),
    "有效证书": $all_certs | map(select(.expiryDate | to_timestamp >= ($now | tonumber)))
  }
' certificates.json

友好文本输出版(非JSON格式)

如果需要纯文本展示,方便阅读:

now=$(date +%s)

jq --arg now "$now" -r '
  def to_timestamp: . | fromdateiso8601;
  .certificates as $all_certs |
  
  "=== 过期证书 ===",
  $all_certs | map(select(.expiryDate | to_timestamp < ($now | tonumber))) |
  .[] | "名称: \(.name) | ID: \(.id) | 过期日期: \(.expiryDate)",
  "",
  "=== 有效证书 ===",
  $all_certs | map(select(.expiryDate | to_timestamp >= ($now | tonumber))) |
  .[] | "名称: \(.name) | ID: \(.id) | 过期日期: \(.expiryDate)"
' certificates.json

适配不同日期格式

如果你的expiryDate不是ISO8601格式(比如2023/12/31),修改to_timestamp函数即可:

# 适配"YYYY/MM/DD"格式
def to_timestamp: . | strptime("%Y/%m/%d") | mktime;

# 适配"Jan 31 2023"格式
def to_timestamp: . | strptime("%b %d %Y") | mktime;

为什么之前的方法行不通?

把JSON转成字符串循环处理会破坏数据结构,导致日期和对应证书信息分离;单独提取日期无法关联原证书的其他字段。而用JQ直接处理完整JSON结构,能在保留所有字段的同时完成筛选和排序。

内容的提问来源于stack exchange,提问作者user327344212

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:50:54