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.