如何将IP列表作为Shell变量传入JQ的IN()函数筛选实例ID
通过Shell变量传入IP列表到JQ脚本筛选InstanceId
方法一:传入空格分隔的IP字符串
先在Shell中定义包含目标IP的字符串变量,再通过--arg传递给JQ,在JQ内部拆分为数组进行匹配:
# 定义Shell变量,IP用空格分隔 TARGET_IPS="i1.i2.i3 i10.i11.i12" # 调用JQ筛选 jq --arg ips "$TARGET_IPS" ' # 将传入的字符串拆分为IP数组 ($ips | split(" ")) as $target_list # 遍历JSON数组中的每个元素 | .[] # 筛选PublicIpAddress在目标IP列表中的项 | select(.PublicIpAddress | IN($target_list[])) # 输出对应的InstanceId | .InstanceId ' data.txt
方法二:传入Shell数组(更适合多IP场景)
如果IP存储在Shell数组中,可先将其转换为JSON数组,再通过--argjson传递给JQ:
# 定义Shell数组存储目标IP IP_ARRAY=("i1.i2.i3" "i10.i11.i12") # 将Shell数组转换为JSON格式的数组字符串 JSON_IP_LIST=$(printf '%s\n' "${IP_ARRAY[@]}" | jq -R . | jq -s .) # 调用JQ筛选 jq --argjson target_list "$JSON_IP_LIST" ' .[] | select(.PublicIpAddress | IN($target_list[])) | .InstanceId ' data.txt
方法三:从命令行参数直接传入IP
如果需要脚本接收命令行传入的IP参数,可这样实现:
#!/bin/bash # 脚本接收任意数量的IP作为参数 jq --argjson target_list "$(printf '%s\n' "$@" | jq -R . | jq -s .)" ' .[] | select(.PublicIpAddress | IN($target_list[])) | .InstanceId ' data.txt
运行脚本时直接传入IP:
./filter_instance.sh i1.i2.i3 i10.i11.i12
关键说明
- 使用
--arg/--argjson传递变量是最安全的方式,能自动处理IP中的特殊字符,避免JQ脚本注入问题。 IN($target_list[])用于判断当前元素的PublicIpAddress是否在目标IP列表中,需JQ 1.6及以上版本支持。
内容的提问来源于stack exchange,提问作者Nam Nguyen
相关产品推荐
相关产品推荐

