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

标签 linux bash ubuntu unix awk

使用此命令,我试图通过我的防火墙进行过滤。
为了提取防火墙规则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 现在可以使用公共(public)索引同时访问两个组件,例如,
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

关于linux - AWK 在 Bash 中返回/打印为关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72227221/

相关文章:

bash - 将带有空格的第二列视为一列

linux - Vim 编辑器始终打开用户主目录

ubuntu - 通过软件服务访问 NAT 路由器后面的 Ubuntu PC

windows - 在Linux下使用Cygwin进行测试

python - Python3 上的 Scipy 安装

linux - 动态创建 proc 目录条目?

bash - 如何在 BASH 中将 md5 和编码为 base64

java - 从命令行调用 Java - Linux 与 Windows

linux - 如何使用 bash 脚本在日期/时间和另一个日期/时间之间提取日志

Git提交失败: "assertion ` g_type_from_name (name) == 0' failed"