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