2016-02-19 81 views
1

我確實很難用shell腳本過濾一些文本。 基本上,我登錄到幾個網絡設備,我發現他們直接連接的鄰居。然後我在一個.txt文件導出這些結果,它看起來像這樣:使用shell腳本進行文本過濾

Host IP: 175.334.2.43 

------------------------- 
Device ID: first_device 
Entry address(es): 
    IP address: 323.43.5.32 
Platform: cisco 428, Capabilities: Router Switch IGMP 
Interface: GigabitEthernet0/3, Port ID (outgoing port): GigabitEthernet0/10 
Holdtime : 130 sec 


advertisement version: 2 
Protocol Hello: OUI=0x0fsdfs0C, Protocol ID=0x0fdf2; payload len=27, value=0dsgfjhb2CAE00FF0000 
VTP Management Domain: '' 
Native VLAN: 453 
Duplex: full 
Management address(es): 
    IP address: 323.43.5.32 

------------------------- 
Device ID: second_device 
Entry address(es): 
    IP address: 323.43.5.398 
Platform: cisco 428, Capabilities: Router Switch IGMP 
Interface: GigabitEthernet0/5, Port ID (outgoing port): GigabitEthernet0/123 
Holdtime : 130 sec 


advertisement version: 2 
Protocol Hello: OUI=0x0fsdfs0C, Protocol ID=0x0fdf2; payload len=27, value=0dsgfjhb2CAE00FF0000 
VTP Management Domain: '' 
Native VLAN: 453 
Duplex: full 
Management address(es): 
    IP address: 323.43.5.398 

Host IP: 342.52.5.2 

------------------------- 
Device ID: third_device 
Entry address(es): 
    IP address: 32.43.15.32 
Platform: cisco 428, Capabilities: Router Switch IGMP 
Interface: GigabitEthernet0/98, Port ID (outgoing port): GigabitEthernet0/165 
Holdtime : 130 sec 


advertisement version: 2 
Protocol Hello: OUI=0x0fsdfs0C, Protocol ID=0x0fdf2; payload len=27, value=0dsgfjhb2CAE00FF0000 
VTP Management Domain: '' 
Native VLAN: 453 
Duplex: full 
Management address(es): 
    IP address: 32.43.15.32 

------------------------- 
Device ID: fourth_device 
Entry address(es): 
    IP address: 0832.54.254.6 
Platform: cisco 428, Capabilities: Router Switch IGMP 
Interface: GigabitEthernet0/543, Port ID (outgoing port): GigabitEthernet0/16 
Holdtime : 130 sec 


advertisement version: 2 
Protocol Hello: OUI=0x0fsdfs0C, Protocol ID=0x0fdf2; payload len=27, value=0dsgfjhb2CAE00FF0000 
VTP Management Domain: '' 
Native VLAN: 453 
Duplex: full 
Management address(es): 
    IP address: 0832.54.254.6 

我要篩選此文件,並組織其列。我這樣做是使用filter_res.sh腳本:

#!/bin/bash 
sed -e '/Management address(es):/{N;d;}' results.txt >results2.txt 
grep "Host IP:" results2.txt | awk '{print $3}' >host_ip.txt 
grep "Device ID:.*" results2.txt | awk '{print $3 ","}' >dev_ids.txt 
grep "IP address: " results2.txt | awk '{print $3 ","}' >cpe_ip.txt 
grep "Platform: " results2.txt | awk '{print $2 $3}' >chassis.txt 
grep "Interface:" results2.txt >interfaces.txt 
awk '{print $7}' interfaces.txt >cpe_int.txt 
awk '{print $2}' interfaces.txt >agg_int.txt 
pr -mts' ' dev_ids.txt cpe_ip.txt chassis.txt agg_int.txt cpe_int.txt >final_results.txt 

的final_results.txt是OK,但我想最後一列在末尾;與host_ip每一行。這是結果我:

first_device, 323.43.5.32, cisco428, GigabitEthernet0/3, GigabitEthernet0/10 
second_device, 323.43.5.398, cisco428, GigabitEthernet0/5, GigabitEthernet0/123 
third_device, 32.43.15.32, cisco428, GigabitEthernet0/98, GigabitEthernet0/165 
fourth_device, 0832.54.254.6, cisco428, GigabitEthernet0/543, GigabitEthernet0/16 

我想會是什麼:

first_device, 323.43.5.32, cisco428, GigabitEthernet0/3, GigabitEthernet0/10, 175.334.2.43 
second_device, 323.43.5.398, cisco428, GigabitEthernet0/5, GigabitEthernet0/123, 175.334.2.43 
third_device, 32.43.15.32, cisco428, GigabitEthernet0/98, GigabitEthernet0/165, 342.52.5.2 
fourth_device, 0832.54.254.6, cisco428, GigabitEthernet0/543, GigabitEthernet0/16, 342.52.5.2 
+0

將'host_ip.txt'添加到列文件列表到'pr'命令時發生了什麼? –

+0

如果我添加它,則主機IP不會出現在其正確的位置上。應該爲其每個連接的設備重複這些IP。 – olivia

+0

'我真的覺得很難用shell腳本來過濾一些文本。「 - 這是完美的,因爲這不是shell腳本的用途。 Shell腳本用於處理文件和進程以及對工具的調用順序。 Awk腳本是用來處理文本的,所以在UNIX中如果你需要過濾(或以其他方式處理)文本,shell只需調用awk來完成。 –

回答

2

你並不需要所有的這些中間步驟,而在一個awk腳本將它們結合起來。這是做這件事的一種方法,不建議長期使用,但也許可以用作起點......

$ awk -v RS="[-]+\n" -v c=',' ' 
       NR>1{print $3 c,$8 c,$10$11,$17,$22 c,hip} 
     /Host IP:/{hip=$NF}' file 


first_device, 323.43.5.32, cisco428, GigabitEthernet0/3, GigabitEthernet0/10, 175.334.2.43 
second_device, 323.43.5.398, cisco428, GigabitEthernet0/5, GigabitEthernet0/123, 175.334.2.43 
third_device, 32.43.15.32, cisco428, GigabitEthernet0/98, GigabitEthernet0/165, 342.52.5.2 
fourth_device, 0832.54.254.6, cisco428, GigabitEthernet0/543, GigabitEthernet0/16, 342.52.5.2 

ps。由於多字符RS規範,需要gawk

+0

非常感謝!這正是我想要做的! – olivia

+0

如果它解決了你的問題,請接受這個答案。 – karakfa

+0

不需要將'-'放在括號表達式中,它在正則表達式中沒有特殊含義,除非將其放在括號表達式中。儘管如此,你應該提到它是特定於gawk的。 –