【问题标题】:awk/sed - searching between lines to return textawk/sed - 在行之间搜索以返回文本
【发布时间】:2013-10-21 23:08:02
【问题描述】:

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

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

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

我已经运行了(如果 'interface' 之后的行没有 带有 'description')。

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

【问题讨论】:

    标签: search sed awk


    【解决方案1】:
    $ awk '/^interface/{if (name) print name; name=$0} /^(description|shutdown)/{name=""} END{if (name) print name}' file
    interface GigabitEthernet3/24
    interface Vlan2
    

    【讨论】:

      【解决方案2】:

      有些是这样的

      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 中的多个字符。


      添加了一个不使用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
      

      【讨论】:

      • 不错的一个!问题是我意识到我的实际文件没有!作为分隔符。当我拉动配置时,它们被删除了。编辑了我上面的输出。
      • 似乎可以正常工作,但使用“接口”作为记录分隔符并不完美。唯一的问题是它会错过'interface'的最后一个实例......
      • also jotne - 我如何配置它以便记录分隔符只是以“接口”开头的行? RS="^interface" 或 RS=/^"interface" 似乎不起作用。
      • 有趣。非常感谢 Jotne!
      • 添加了不带RS的版本
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多