2015-11-02 17 views
0

我有一個創建關聯數組的bash腳本。 然後,我啓動一個awk命令來分析grep命令的輸出。 在我的awk命令中,我想使用關聯的數組進行打印,但如果我理解的很好,awk將無法訪問它。那我該怎麼做呢?在awk中使用外部關聯數組

我只想列出其速度爲「10」,「a-10」,「100」或「a-100」的每個端口的每個設備(每個設備1個文件)。在輸出中,我需要的端口(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)}' 
    ... 

輸入樣本: 文件TF5XXXXXX而不.desc

Port  Name    Status  Vlan  Duplex Speed Type 
Gi1/0/1 *** SW1-BTB-XXX connected trunk  a-full a-1000 10/100/1000BaseTX 
Gi1/0/4 XYZAB connected trunk  a-full a-100 10/100/1000BaseTX 
Gi1/0/5 YAZER connected trunk  a-full 10 10/100/1000BaseTX 
Gi1/0/6 BLABL connected trunk  a-full a-10 10/100/1000BaseTX 
Gi1/0/7 AHAHO connected trunk  a-full 1000 10/100/1000BaseTX 
Gi1/0/8 XXXXX connected trunk  a-full 100 10/100/1000BaseTX 
Gi1/0/9 XXXXX connected trunk  a-full a-1000 10/100/1000BaseTX 

文件TF5XXXXXX與.desc

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 

感謝您的時間:)

+2

正確的,AWK是不是殼。擺脫你的shell循環,只要做你想在awk中做的事情。請參閱http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice。發佈一些示例輸入和期望的輸出,如果你想獲得幫助。 –

+1

不要分析'ls'。使用'輸入TF5 *;而不是[[$ f =〜.desc]] && continue'。 – chepner

+0

我已經在輸出中添加了一些輸入和我想要的內容。 – Rian

回答

0

你可以嘗試這樣的事情:

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 
+0

的.desc。謝謝@klashxx 我得到一個錯誤: './script_countspeed_2.sh awk:cmd。第2行:(FILENAME = TF5_MOBXXXXXXX FNR = 1)fatal:嘗試訪問字段-1' – Rian

+0

然後我猜測'TAB''是輸入文件的字段分隔符..正確嗎? @Rian – klashxx

+0

Nop,TAB必須是輸出字段分隔符。但我的輸入文件的文件是一個空間。但在文件的開頭,有一些空行。 @klashxx – Rian