从显示库存获取序列号

从显示库存获取序列号

我想从命令获取 cisco 设备的device ID和,我在文件中得到了终端输出,如下所示:Serial Numbershow inventory

show inventory
NAME: "1", DESCR: "WS-C3750G-12S"
PID: WS-C3750G-12S-E   , VID: V06, SN: FDO1129Z9ZJ

NAME: "GigabitEthernet1/0/1", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K022        

NAME: "GigabitEthernet1/0/2", DESCR: "10/100/1000BaseTX SFP"
PID: GLC-T               , VID:    , SN: 00000MTC1444080Z

NAME: "GigabitEthernet1/0/3", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K083        

NAME: "GigabitEthernet1/0/4", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K021        

NAME: "GigabitEthernet1/0/5", DESCR: "1000BaseSX SFP"
PID:                     , VID:    , SN: FNS11190FLE     

NAME: "GigabitEthernet1/0/6", DESCR: "1000BaseSX SFP"
PID:                     , VID:    , SN: P7K08UQ         

NAME: "GigabitEthernet1/0/7", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K032        

NAME: "GigabitEthernet1/0/8", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: H006K040        

NAME: "GigabitEthernet1/0/9", DESCR: "1000BaseLX SFP"
PID:                     , VID:    , SN: FNS14420533     

NAME: "GigabitEthernet1/0/10", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS16361SG0     

NAME: "GigabitEthernet1/0/11", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS174002FT     

NAME: "GigabitEthernet1/0/12", DESCR: "1000BaseLX SFP"
PID: GLC-LH-SMD          , VID: V86, SN: FNS183503FS     


Barragan_3750>

我想获取SN名为“1”的设备以及device name“>”后面的设备,如下所示:

Barragan_3750
SN: FDO1129Z9ZJ

预先非常感谢。

答案1

使用 GNU sed

$ show inventory | sed -n '/^NAME: "1"/,+1s/^.*, //p'
DESCR: "WS-C3750G-12S"
SN: FDO1129Z9ZJ

编辑脚本sed将查找以 开头的行NAME "1",并对这些行和紧随其后的第一行应用替换。

替换将删除行中直到并包括最后一个逗号(以及后面的空格)的所有内容。结果字符串被打印到终端。

如果您只需要序列号和最后一行输出:

$ show inventory | sed -n -e '/^NAME: "1"/{n;s/^.*, //p}' -e '$p'
SN: FDO1129Z9ZJ
Barragan_3750>

在这里,sed脚本像以前一样找到该行,但立即读取下一行(带有n)并仅在该行上执行与以前相同的替换。这将为您提供序列号。

然后它也打印输入的最后一行。

答案2

使用空行作为记录分隔符。

如果该行匹配 ' "1",' 保存最后一个字段。

打印没有最后一个字符的最后一行并打印保存的字段。

awk 'BEGIN {RS = ""}
     { if ($0 ~/ "1", /) { serial=$NF } }
     END { print substr($0, 1, length($0)-1) ; print "SN: " serial }' file

答案3

show inventory | perl -l -00ane '
  /^NAME:\s+"1",/m and $serial_num = "@F[-2,-1]";
  print substr($_,0,-1), $\, $serial_num if eof;
'

对以上内容进行简单总结:

为了达到上述目的,我们Perl使用了一些选项。我们在paragraph mode -00AND 和自动分割模式下操作 Perl ,每次读入新段落时,-a每个段落都会按空格分割以填充数组。@F

这是Perl's $_吞下一段后的样子:

名称:“1”,描述:“WS-C3750G-12S”

PID:WS-C3750G-12S-E,VID:V06,SN:FDO1129Z9ZJ

IOW,$_持有一段。然后将其$_分割成\s+这样: @F = split /\s+/, $_; 这会产生@F数组 ,从相反的方向说明: $F[-1] = 'FDO1129Z9ZJ'; $F[-2] = 'SN:' ...

And mind you , all of the above happens under the hood。一旦解决了这个问题,我们就可以看到 Perl 代码片段的代码: “,/m =>当 a 以 a 开头或以a开头时/^NAME:\s+",将返回 true,因为模式修饰符代表。为此,我们得到了序列号作为该段落的最后一个字段的编号,并获取字符串作为倒数第二个字段。现在我们可以像 as 一样一次性提取它们,并将它们放在双引号中,就像暗示着那个著名的 shell 变量一样。意味着我们得到了一个以空格分隔的数组元素列表,准确地说,它的值充当分隔符,就像 in 的第一个字符决定in的双引号插值一样。record aka para aka $_NAME...NAME...newline/mfor multiple-line matching$F[-1]SN:$F[-2]@F[-2,-1]"@F[-2,-1]""$F[-2]" space "$F[-1]""$@"$" superglobalIFS"$*"bash

现在我们有了serial number设备,我们去寻找device number要找到的last recordaka eof。这里,substr($_,0,-1)采取$_akapara并从其1末尾开始删除 char所表示的内容,并在删除后返回并将已确定的字符与由于该选项而填充了 a 的字符连接起来。这最终打印在标准输出上。-1-serial_number$\\n-l

希望我不是很困惑&HTH。

相关内容