Lendo a versão do vmlinuz usando o comando file

0

Como o título diz:

Como ler a versão vmlinuz (diretamente) usando o comando file ?

Usando: file /vmlinuz | grep version ,
Deve mostrar assim 4.11.0-9.1-liquorix-amd64 .

    
por Daniel 23.07.2017 / 17:21

1 resposta

0

Nota inicial

Meu file -bL /vmlinuz retorna:

Linux kernel x86 boot executable bzImage, version 3.2.0-4-amd64 ([email protected]) #1 SMP Debian 3., RO-rootFS, swap_dev 0x2, Normal VGA

Esse conhecimento pode ser útil se você precisar ajustar ou depurar o que segue.

com grep

Você usou grep , é por isso que, no começo, presumo que você queira que seja uma parte crucial da solução.

file gera uma linha por seu argumento, grep trabalha com linhas inteiras, então parece como se não fosse uma ferramenta correta aqui. Existe, no entanto, a opção -o que faz com que grep report corresponda apenas a parte de uma linha. Isto é não-POSIX em primeiro lugar, então eu realmente não me importo com outras partes do seguinte comando sendo compatível com POSIX.

O comando é:

file -bL /vmlinuz | grep -o 'version [^ ]*' | cut -d ' ' -f 2

Sobre file opções: -L faz com que ele siga links simbólicos ( /vmlinuz é um link simbólico para /boot/vmlinuz-something ), -b impede a impressão do nome do arquivo (porque não precisamos disso de qualquer maneira) .

A interpretação de version [^ ]* é: literal version , depois um espaço literal e, em seguida, tantos caracteres não espaciais quanto possível. No seu caso, a saída será version 4.11.0-9.1-liquorix-amd64 .

Finalmente, cut deixa apenas o segundo campo, tendo um espaço como delimitador de campo. Isso deve produzir a saída de que você precisa.

Sem grep

A solução de forma bastante simples pode ser:

file -bL /vmlinuz | sed 's/.*version //;s/ .*//'

Substitui as partes que você não quer com strings vazias. Se a saída file tiver formato inesperado (por exemplo, você não usou -L enquanto deveria), a saída não está vazia, mas é inválida. Observe que a primeira solução (com grep ) não gera nada nesse caso.

Com alguns truques de sed , podemos corrigir isso:

file -bL /vmlinuz | sed -n '/version /!q;s/.*version //;s/ .*//p'

No comando acima, sed silenciosamente sai quando não há version em sua entrada. Agora, se o seu sed suportar isso, você pode querer que ele retorne o status de saída assim:

file -bL /vmlinuz | sed -n '/version /!q1;s/.*version //;s/ .*//p'

Eu considero este último comando o melhor até agora.

    
por 25.07.2017 / 16:24