Arrays 在awk中使用外部关联数组

Arrays 在awk中使用外部关联数组,arrays,bash,awk,Arrays,Bash,Awk,我有一个bash脚本,它创建了一个关联的数组。 然后,我启动一个awk命令来解析grep命令的输出。 在我的awk命令中,我想使用关联的数组进行打印,但如果我理解得很好,awk将无法访问它。那我怎么做呢 我只想为每个设备(每个设备1个文件)列出其速度为“10”、“a-10”、“100”或“a-100”的每个端口。在输出中,我需要端口(GiX/X/X)、VLAN、速度和完整描述 for entry in `ls TF5* | grep -v ".desc"`; do declare -A

我有一个bash脚本,它创建了一个关联的数组。 然后,我启动一个awk命令来解析grep命令的输出。 在我的awk命令中,我想使用关联的数组进行打印,但如果我理解得很好,awk将无法访问它。那我怎么做呢

我只想为每个设备(每个设备1个文件)列出其速度为“10”、“a-10”、“100”或“a-100”的每个端口。在输出中,我需要端口(GiX/X/X)、VLAN、速度和完整描述

for entry in `ls TF5* | grep -v ".desc"`; do
    declare -A description

    while read line
    do
            if echo $line | grep "Gi" > /dev/null
            then
                    port=$(echo "$line" | awk '{print $1}')
                    description[${port}]=$(echo "$line" | tr -s ' ' | cut -d' ' -f4-)
            fi
    done < $entry.desc

    grep " a-10 " $entry | awk '{printf ("a10:\t%s ;\t%s ;\t%s ;\n", $1, "$description[$1]", $4)}'
    ...
带有.desc的文件TF5xxxxx

Interface                      Status         Protocol Description
Vl1                            admin down     down
Vl101                          up             up
Fa0                            down           down
Gi1/0/1                        up             up       *** SW1-BTB-BALBLA ***
Gi1/0/2                        down           down
Gi1/0/3                        down           down     DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/4                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/5                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/6                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/7                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/8                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
Gi1/0/9                        up             up       DESCRIPTION CENSURED BUT I NEED TO CATCH IT
输出样本:

a-100 TAB Gi1/0/4 TAB  DESCRIPTION TAB VLAN
10 TAB Gi1/0/5 TAB  DESCRIPTION TAB VLAN
a-10 TAB Gi1/0/6 TAB  DESCRIPTION TAB VLAN
100 TAB Gi1/0/8 TAB  DESCRIPTION TAB VLAN

谢谢您的时间:)

您可以尝试以下内容:

for entry in TF5*.desc;do 
  awk 'NR==FNR{key=$1;$1=$2=$3="";a[key]=$0;next}
       $(NF-1)~/(a-)?10(0)?$/{print $(NF-1)"\t"$1"\t"a[$1]"\t"$4}' $entry ${entry%.desc}
done
结果:

a-100   Gi1/0/4    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
10  Gi1/0/5    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
a-10    Gi1/0/6    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
100 Gi1/0/8    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk

正确,awk不是外壳。摆脱你的shell循环,在awk中做你想做的任何事情。看见如果需要帮助,请发布一些示例输入和预期输出。不要解析
ls
。使用
输入TF5*;改为执行[[$f=~.desc]]&&continue
。我已经添加了一些输入,并在输出中添加了我想要的内容。@chepner,我不确定是否理解最后一部分:
[[$f=~.desc]]]&&continue
我想$f实际上是$entry,但为什么要继续,为什么要用你的测试替换
grep
。模式匹配所有文件,测试将跳过名称中包含.desc的文件感谢@klashxx我遇到一个错误:
/script\u countspeed\u 2.sh awk:cmd。第2行:(FILENAME=TF5\u MOBXXXXXXX FNR=1)致命:尝试访问字段-1
然后我猜
选项卡
是输入文件的字段分隔符。。对吗@RianNop,TAB必须是输出字段分隔符。但是我的输入文件的lefs是一个空格。但是在文件的开头,有一些空行@克拉什问题是一开始我的空行@克拉什
a-100   Gi1/0/4    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
10  Gi1/0/5    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
a-10    Gi1/0/6    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk
100 Gi1/0/8    DESCRIPTION CENSURED BUT I NEED TO CATCH IT  trunk