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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 04:12:12