Eu tenho um comando que gera informações sobre todos os slots DIMM em blocos como o seguinte:
ID SIZE TYPE
44 105 SMB_TYPE_MEMDEVICE (type 17) (memory device)
Manufacturer: NO DIMM
Serial Number: NO DIMM
Asset Tag: NO DIMM
Location Tag: P1-DIMMD1
Part Number: NO DIMM
Physical Memory Array: 43
Memory Error Data: Not Supported
Total Width: 0 bits
Data Width: 0 bits
Size: Not Populated
Form Factor: 9 (DIMM)
Set: None
Rank: Unknown
Memory Type: 2 (unknown)
Flags: 0x4
SMB_MDF_UNKNOWN (unknown)
Speed: Unknown
Configured Speed: Unknown
Device Locator: P1-DIMMD1
Bank Locator: P0_Node1_Channel0_Dimm0
Minimum Voltage: 1.20V
Maximum Voltage: 1.20V
Configured Voltage: 1.20V
Os blocos começam com o ID SIZE TYPE
cabeçalho e terminam com as informações de tensão configuradas. O comando gera um desses blocos de dados para cada DIMM separados por uma única linha em branco cada.
Eu gostaria de obter o bloco de informações para um slot DIMM específico com base no Location Tag
campo, mas não tenho certeza de como fazer isso. Tenho certeza de que isso pode ser feito, awk
mas só sei imprimir a correspondência awk '/P1-DIMMD1/'
ou a linha antes da correspondênciaawk '/P1-DIMMD1/ {print a}{a=$0}'
Alguém sabe como eu poderia extrair todo esse bloco de dados se o Location Tag
resultado da minha pesquisa ( P1-DIMMD1
)?
O seguinte corresponderá à tag fornecida na variável tag:
O script AWK é
Acumulamos um bloco na
block
variável e o produzimos quando chegamos ao final do bloco, se vimos a tag correta no processo.Você poderia usar ed ... e sed, cara!
Você tem que querer usar ed para este, porém, como ed quer operar em um arquivo, não como parte de um pipeline.
command > dimm-output
wanted=P1-DIMMD1
ed -s dimm-output <<< $'/Location Tag: '"$wanted"$'\n?^ID.*SIZE.*TYPE\n.,/Configured Voltage/p\nq\n' | sed 1,2d
A
ed
cadeia de comandos se divide em quatro\n
comandos separados:/
, pelo texto "Location Tag: " seguido do valor da$wanted
variável?
, para o padrão: (início de linha), "ID", qualquer coisa, "TAMANHO", qualquer coisa, "TIPO".
), até (,
) a próxima linha que corresponde a "Voltagem configurada", imprima essas linhas (p
)q
Como ed imprime automaticamente a linha correspondente quando você pesquisa, usei
sed
aqui para excluir essas duas linhas.Inspirado pela ótima resposta de @Stephen Kitts, escrevi um script um pouco mais geral para realizar a correspondência de blocos ao ter um padrão inicial e final especificado.
Uso:
match_block START END MATCH [FILE]
ou
Obrigado por sugerir escrever isso como um
awk
script diretamente. Meu script shell original era:Uso:
match_block START END MATCH [FILE]
.Se o arquivo for omitido,
stdin
será usado.No seu caso:
ou