명령에서 cisco 장치의 합계를 얻고 싶고 device ID
다음과 같은 파일에 터미널 출력이 있습니다.Serial Number
show 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
-00
Perl을 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
/m
for multiple-line matching
$F[-1]
SN:
$F[-2]
@F[-2,-1]
"@F[-2,-1]"
"$F[-2]" space "$F[-1]"
"$@"
$" superglobal
IFS
"$*"
bash
이제 장비를 갖추었으니 찾고 싶은 아카를 serial number
찾으러 갑시다 . 여기에서는 aka를 가져와서 문자가 나타내는 내용을 끝부터 삭제하고 삭제 후 다시 돌아가 옵션으로 인해 채워진 문자와 결정된 문자를 연결합니다 . 이는 결국 표준 출력으로 인쇄됩니다.device number
last record
eof
substr($_,0,-1)
$_
para
1
-1
-
serial_number
$\
\n
-l
너무 혼란스럽지 않기를 바랍니다&HTH.