1

我正在扫描没有描述且未关闭的接口的 cisco 配置。

如果接口没有描述,应该关闭它。

如果接口有描述,这总是接口之后的第一行。我已经编写了一个脚本,它使用 awk 向我展示了我的所有界面和描述,但我不确定如何做一些稍微复杂的事情。

我已经运行了这个(如果“接口”后面的行带有“描述”)。

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

但问题是,有些行以“接口”开头,根本没有配置,或者有其他东西。所以它获取了错误的信息。

我需要一些东西来查看以单词“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
4

3 回答 3

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
于 2013-10-21T12:00:28.790 回答
1
$ awk '/^interface/{if (name) print name; name=$0} /^(description|shutdown)/{name=""} END{if (name) print name}' file
interface GigabitEthernet3/24
interface Vlan2
于 2013-10-21T14:52:31.237 回答
0

不要逐行处理。使用“接口”作为记录分隔符。接口中的其余行将在 $0 中,在 $1 中的接口名称。

于 2013-10-21T12:04:09.677 回答