디스플레이 재고에서 일련번호 받기 [닫기]

디스플레이 재고에서 일련번호 받기 [닫기]

명령에서 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 -00Perl을 AND 및 자동 분할 모드로 작동하며, 새 단락을 읽을 때마다 -a각 단락이 공백으로 분할되어 배열을 채웁니다.@F

Perl's $_조각을 삼킨 후의 모습은 다음과 같습니다 .

이름: "1", 설명: "WS-C3750G-12S"

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

아이고, $_잠시만요. 그런 다음 다음과 같이 $_분할합니다 . 그러면 반대 방향에서 설명한 배열이 생성됩니다. \s+@F = split /\s+/, $_;@F$F[-1] = 'FDO1129Z9ZJ'; $F[-2] = 'SN:' ...

And mind you , all of the above happens under the hood. 이 문제가 해결되면 다음 Perl 조각의 코드를 볼 수 있습니다. ",/m =>는 /^NAME:\s+"패턴 수정자가 나타내는 대로 a가 a로 시작하거나 a로 시작할 때 true를 반환합니다. 이를 위해 일련 번호를 마지막 번호로 얻습니다. 이제 다음과 같이 한 번에 문자열을 추출하고 그 유명한 쉘 변수처럼 큰따옴표로 묶을 수 있습니다. 이는 공백으로 구분된 배열 요소 목록을 얻는다는 의미입니다. , 정확하게 말하면 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찾으러 갑시다 . 여기에서는 aka를 가져와서 문자가 나타내는 내용을 끝부터 삭제하고 삭제 후 다시 돌아가 옵션으로 인해 채워진 문자와 결정된 문자를 연결합니다 . 이는 결국 표준 출력으로 인쇄됩니다.device numberlast recordeofsubstr($_,0,-1)$_para1-1-serial_number$\\n-l

너무 혼란스럽지 않기를 바랍니다&HTH.

관련 정보