AWK在Bash中作为关联数组返回/打印



使用这个命令,我试图通过防火墙进行过滤。以提取防火墙规则ID号和IP地址。

existing=($(ufw status numbered | grep -e ''"$ssh_port"'' | grep -i 'SSH' | awk '{gsub(/[][]/,""); print $1 $5}'))

ufw status numbered的原始输出如下所示:

[286] 22                        ALLOW IN    1.1.1.1                    # SSH
[287] 22                        ALLOW IN    1.1.1.1                    # SSH
[299] 22                        ALLOW IN    aaaa:aaaa:aaaa:aaaa::aaaa  # SSH

我要做的是返回print $1 $5作为一个数组。

为了像这样访问bash中的每一行:

echo ${existing[0][0]} -> 286
echo ${existing[0][1]} -> 1.1.1.1
echo ${existing[1][0]} -> 287
echo ${existing[1][1]} -> 1.1.1.1
echo ${existing[2][0]} -> 299
echo ${existing[2][1]} -> aaaa:aaaa:aaaa:aaaa::aaaa

我怎样才能做到这一点?

模拟ufx输出:

$ cat ufw.dat
[286] 22                        ALLOW IN    1.1.1.1                    # SSH
[287] 22                        ALLOW IN    1.1.1.1                    # SSH
[299] 22                        ALLOW IN    aaaa:aaaa:aaaa:aaaa::aaaa  # SSH

awk将所需的数据传递给bash/while循环,以便解析并存储在一对数组中:

declare -a id_array=()
declare -a ip_array=()
ndx=-1
while read -r id ip
do
(( ndx++ ))
id_array[$ndx]="${id}"
ip_array[$ndx]="${ip}"
done < <(cat ufw.dat | awk '/SSH/ {gsub(/[][]/,""); print $1,$5}')

由此产生:

$ declare -p id_array ip_array
declare -a id_array=([0]="286" [1]="287" [2]="299")
declare -a ip_array=([0]="1.1.1.1" [1]="1.1.1.1" [2]="aaaa:aaaa:aaaa:aaaa::aaaa")

OP现在可以使用公共索引同时访问两个组件,例如

for i in "${!id_array[@]}"
do
echo "$i : ${id_array[$i]} : ${ip_array[$i]}"
done
0 : 286 : 1.1.1.1
1 : 287 : 1.1.1.1
2 : 299 : aaaa:aaaa:aaaa:aaaa::aaaa

最新更新