2013-10-21 113 views
1

我正在掃描cisco configs,用於沒有描述但沒有關閉的接口。awk/sed - 在文本行之間搜索以返回文本

如果接口沒有描述,應該關閉。

如果接口有說明,這總是接口之後的第一行。我寫了一個腳本,用awk顯示了我所有的接口和描述,但我不確定如何做更復雜的事情。

我已經運行這個(如果'接口'之後的行不是與'描述')。

awk '{if ((lastline ~ /^interface/) && ($0 !~ /^ description/)) {print FILENAME ";" lastline ORS FILENAME ";" $0} lastline=$0}' 

但問題是,有些行以'interface'開頭,根本沒有配置,或者有其他的東西。所以它會收集錯誤的信息。

我需要查看以'interface'開頭的每行實例之間的所有行,並且如果沒有以'description'或'shutdown'開頭的行,那麼我需要它來打印界面線以及文件名。對我來說有點複雜,我是初學者! :(

因此,例如,這個文件:

interface GigabitEthernet3/23 
logging event link-status 
shutdown 
interface GigabitEthernet3/24 
interface Vlan1 
description 'VLAN 1' 
interface Vlan2 
no ip address 
interface Vlan4 
shutdown 

將返回

interface GigabitEthernet3/24 
interface Vlan2 

回答

1

一些這樣

awk '!/shutdown|description/ {print FILENAME " - "$1 FS $2}' RS="!" file1.txt 
file1.txt - interface GigabitEthernet3/24 
file1.txt - interface Vlan2 

這裏我設置記錄選擇到!和打印線不包含shutdown or description


更新版本

awk '!/shutdown|description/ && NF {print FILENAME " - " RS,$1}' RS="interface" file1.txt 
file1.txt - interface GigabitEthernet3/24 
file1.txt - interface Vlan2 

這種使用interface爲RS。這可能只適用於gnu awk,因爲並非所有的awk都支持RS中的多個字符。


加入awk版本不使用RS更加便攜:

awk '/^interface/ {if (!f && NR>1) print FILENAME,"-",s;s=$0;f=0} /^shutdown|^description/ {f=1} END { if (!f) print FILENAME,"-",s}' file1.txt 

而一些更具可讀性:

awk ' 
    /^interface/ { 
     if (!f && NR>1) 
      print FILENAME,"-",s 
     s=$0 
     f=0 
     } 
    /^shutdown|^description/ { 
     f=1 
     } 
    END { 
     if (!f) 
      print FILENAME,"-",s 
     } 
    ' file1.txt 
+0

不錯的一個!問題是我意識到我的實際文件沒有!作爲分隔符。他們被刪除時,我拉配置。編輯我的輸出上面。 –

+0

似乎可以正常工作,但不能完美地使用'界面'作爲記錄分隔符。唯一的一點是,它會錯過'接口'的最後一個實例... –

+0

也jotne - 我如何配置,以便記錄分隔符只是以'界面'開頭的行? RS =「^ interface」或RS = /「interface」似乎不起作用。 –

0

一行不處理行。使用「界面」作爲記錄分隔符。接口中的其餘行將變爲$ 0,接口名稱爲$ 1。

1
$ awk '/^interface/{if (name) print name; name=$0} /^(description|shutdown)/{name=""} END{if (name) print name}' file 
interface GigabitEthernet3/24 
interface Vlan2