jq中如何按IP地址排序?

Sco*_*oni 1 sorting json ipv4 jq

如何使用jq按 IPv4 地址值作为 32 位整数而不是按字母数字对对象数组进行排序?

为了视觉清晰度而使用一些额外的格式来说明我的意思:

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
' |jq -sr '.|=sort_by(.ip) |.[] |[.name, .ip] |@tsv'

host2   10.10.10.10
host1   10.9.9.9
dns 4.4.4.4
Run Code Online (Sandbox Code Playgroud)

|=sort_by(.ip)按字母数字顺序排序,但我希望数组按“IPnumerically”排序。如果我有这样的 TSV 格式,我可以使用外部工具(例如 的非 POSIX-V扩展sort)随后在外部执行此操作,但是有没有办法在 内部执行此操作jq

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
    ' |jq -sr '.|=sort_by(.ip) |.[] |[.name, .ip] |@tsv' |sort -t$'\t' -Vk2
dns 4.4.4.4
host1   10.9.9.9
host2   10.10.10.10
Run Code Online (Sandbox Code Playgroud)

njz*_*zk2 5

您可以简单地拆分 ip 并将其转换为数字数组:

sort_by(.ip | split(".")[] | tonumber)
Run Code Online (Sandbox Code Playgroud)

.|=完整命令(请注意,不需要开头的重新分配( )):

$ echo '
    {"name": "dns", "ip": "4.4.4.4"}
    {"name": "host1", "ip": "10.9.9.9"}
    {"name": "host2", "ip": "10.10.10.10"}
' | jq -sr 'sort_by(.ip | split(".")[] | tonumber) | .[] | [.name, .ip] | @tsv'

dns 4.4.4.4
host1   10.9.9.9
host2   10.10.10.10
Run Code Online (Sandbox Code Playgroud)