如何仅用jq提取cname匹配comodoca.com的记录Line值?
纯jq实现提取指定CNAME记录的Line数值
需求说明
从给定的DNS zone JSON数据中,提取所有cname字段后缀为comodoca.com的记录对应的Line数值,期望输出:
97 114
输入JSON数据
{ "data": { "zone": [ { "record": [ { "Line": 1, "raw": "; cPanel first:11.25.0-CURRENT_46156 (update_time):1708598274 Cpanel::ZoneFile::VERSION:1.3 hostname:server2.something.com latest:110.0.23", "type": ":RAW" }, { "Line": 4, "Lines": 1, "class": "IN", "expire": "1209600", "minimum": "86400", "mname": "ns1.something.com", "name": "domain.com.", "refresh": "3600", "retry": "1800", "rname": "noreply.something.com", "serial": "2024022220", "ttl": 86400, "type": "SOA" }, { "Line": 6, "address": "195.216.197.40", "class": "IN", "name": "ftp.domain.com.", "ttl": 60, "type": "A" }, { "Line": 97, "class": "IN", "cname": "0c960d0901ed2ec4ae18f39c5dcf547e.b3778944564d3daa444a04e58f3b1649.comodoca.com", "name": "_f0ff734bef4f3db24a0dc94fc6b1d21a.fab.domain.com.", "ttl": 60, "type": "CNAME" }, { "Line": 114, "class": "IN", "cname": "eaf925d9c7f0fbe3e1abcaa94671918b.814242e76a38aea40755b96ee978a9fc.comodoca.com", "name": "_671f4707fe0a8b2443fc93fe3a7a7a1d.www.software.domain.com.", "ttl": 60, "type": "CNAME" } ] } ] }, "metadata": { "command": "dumpzone", "reason": "Zone Serialized", "result": 1, "version": 1 } }
原有实现方式
通过jq结合grep、awk完成,命令如下:
jq --raw-output '.data.zone[].record[] | (.Line|tostring) + "," + .cname ' | grep -i 'comodoca.com' | awk -F, '{ print $1}'
问题
尝试以下jq命令未生效,希望找到纯jq的解决方案:
jq --raw-output '.data.zone[].record[] | select(endswith("comodoca.com"))]'
纯jq解决方案
可行命令
jq --raw-output '.data.zone[].record[] | select(.cname != null and .cname | endswith("comodoca.com")) | .Line'
命令解释
.data.zone[].record[]:遍历JSON中所有的DNS记录条目select(.cname != null and .cname | endswith("comodoca.com")):- 先筛选出存在
cname字段的记录,避免无该字段的条目报错 - 再判断
cname字段的值是否以comodoca.com结尾
- 先筛选出存在
.Line:提取符合条件记录的Line数值--raw-output:输出原始数值,避免包裹引号
执行结果
97 114
原命令失效原因
之前的命令未指定判断的字段是.cname,且没有过滤无cname字段的条目,导致无法正确匹配目标记录。
内容的提问来源于stack exchange,提问作者willdashwood
相关产品推荐
相关产品推荐

