Search awk/sed-在行间搜索以返回文本

Search awk/sed-在行间搜索以返回文本,search,sed,awk,Search,Sed,Awk,我正在扫描cisco配置,查找没有说明且未关闭的接口 如果接口没有说明,则应将其关闭 如果接口有说明,则该说明始终是接口后的第一行。我已经编写了一个脚本,用awk向我展示了我所有的界面和描述,但我不知道如何做一些稍微复杂一点的事情 我已经运行了这个(如果“接口”后面的行与“说明”不符) 但问题是,有些行以“interface”开头,根本没有配置,或者有其他内容。所以它获取了错误的信息 我需要一些东西来查看以“interface”开头的行的每个实例之间的所有行,如果没有以“description”

我正在扫描cisco配置,查找没有说明且未关闭的接口

如果接口没有说明,则应将其关闭

如果接口有说明,则该说明始终是接口后的第一行。我已经编写了一个脚本,用awk向我展示了我所有的界面和描述,但我不知道如何做一些稍微复杂一点的事情

我已经运行了这个(如果“接口”后面的行与“说明”不符)

但问题是,有些行以“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
有些像这样

awk '!/shutdown|description/ {print FILENAME " - "$1 FS $2}' RS="!" file1.txt
file1.txt - interface GigabitEthernet3/24
file1.txt - interface Vlan2
在这里,我将记录选择器设置为
,并打印不包含
关闭或说明的行


更新版本

awk '!/shutdown|description/ && NF {print FILENAME " - " RS,$1}' RS="interface" file1.txt
file1.txt - interface GigabitEthernet3/24
file1.txt - interface Vlan2
这将
接口
用作RS。这可能仅适用于
gnu awk
,因为并非所有
awk
都支持RS中的多个字符


添加了一个不使用RS的
awk
版本,以提高便携性:

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,接口名称为$1。

很好!问题是我意识到我的实际文件没有!作为分隔符。当我拉配置时,它们会被删除。编辑了上面的输出。使用“接口”作为记录分隔符似乎可以正常工作,但并不完美。唯一的问题是它会丢失ss“interface”的最后一个实例…也是jotne-我如何配置它,以便记录分隔符仅是以“interface”开头的行?RS=“^interface”或RS=/^“interface”似乎不起作用。有趣。非常感谢jotne!添加了一个没有
RS
$ awk '/^interface/{if (name) print name; name=$0} /^(description|shutdown)/{name=""} END{if (name) print name}' file
interface GigabitEthernet3/24
interface Vlan2
$ awk '/^interface/{if (name) print name; name=$0} /^(description|shutdown)/{name=""} END{if (name) print name}' file
interface GigabitEthernet3/24
interface Vlan2