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.