Obter número de série de Mostrar inventário [fechado]

1

Eu gostaria de obter o device ID e Serial Number de um dispositivo cisco do comando show inventory , eu tenho a saída do terminal em um arquivo que se parece com isso:

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>

Gostaria de obter o SN do dispositivo chamado "1" e o device name que está atrás de ">", algo assim:

Barragan_3750
SN: FDO1129Z9ZJ

muito obrigado antecipadamente.

    
por Cesar Alejandro Villegas Yepez 24.02.2017 / 16:17

3 respostas

2

Usando o GNU sed :

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

O script de edição sed procurará linhas começando com NAME "1" e aplicará uma substituição a essas linhas e à primeira linha imediatamente a seguir.

A substituição removerá tudo nas linhas até e incluindo a última vírgula (e o espaço logo após). As seqüências resultantes são impressas no terminal.

Se for apenas o número de série e a última linha de saída desejada:

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

Aqui, o script sed encontra a linha como antes, mas lê imediatamente a próxima linha (com n ) e realiza a mesma substituição que antes apenas nessa linha. Isso lhe dá o número de série.

Em seguida, imprime a última linha da entrada também.

    
por 24.02.2017 / 16:42
1

Use linhas em branco como separador de registro.

Se a linha corresponder a "" 1 ", salve o último campo.

Imprima a última linha sem o último caractere e imprima o campo salvo.

awk 'BEGIN {RS = ""}
     { if ($0 ~/ "1", /) { serial=$NF } }
     END { print substr($0, 1, length($0)-1) ; print "SN: " serial }' file
    
por 24.02.2017 / 16:43
1
show inventory | perl -l -00ane '
  /^NAME:\s+"1",/m and $serial_num = "@F[-2,-1]";
  print substr($_,0,-1), $\, $serial_num if eof;
'

Um breve resumo dos itens acima:

Para definir o estágio declarado, as opções Perl são utilizadas. Operamos o Perl no modo paragraph mode -00 AND também no modo auto-split -a , onde cada parágrafo é dividido em espaços para preencher o array @F cada vez que um novo parágrafo é lido.

Isto é o que o Perl's $_ parece depois de engolir um para:

NOME: "1", DESCR: "WS-C3750G-12S"

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

IOW, $_ contém um parágrafo. Então esse $_ é dividido em \s+ , assim: %código% Isso resulta na matriz @F = split /\s+/, $_; , indicando de reverso:    @F

$F[-1] = 'FDO1129Z9ZJ'; $F[-2] = 'SN:' ... . Uma vez que isso é feito, chegamos ao código do trecho de Perl: And mind you , all of the above happens under the hood ", / m = > retornará verdadeiro para /^NAME:\s+" quando começar com record aka para aka $_ ou começa com NAME... em NAME... devido ao modificador de padrão newline representando /m . Para isso, obtemos o número de série do como o último campo for multiple-line matching deste para e pegamos a string $F[-1] como o segundo último campo SN: Agora podemos extraí-los de uma só vez como $F[-2] e colocá-los sob aspas duplas como @F[-2,-1] implicando "@F[-2,-1]" algo nos moldes da famosa variável de shell "$F[-2]" space "$F[-1]" , o que significa que temos uma lista separada por espaço de elementos de matriz. Para ser preciso, é o "$@" , cujo valor atua como separador, assim como o primeiro caractere em $" superglobal determina a interpolação com aspas duplas de IFS em "$*" .

Agora temos nossos bash do dispositivo, vamos procurar o serial number , que é o device number aka last record . Aqui, o eof pega o substr($_,0,-1) aka $_ e remove para char a partir do final de 1 que é o que o -1 significa e retorna depois de remover e concatena o - já determinado com o serial_number , que é preenchido com $\ devido à opção \n . Isso é finalmente impresso na stdout.

Espero não ser muito confuso & HTH.

    
por 25.02.2017 / 03:00