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.