Forma independente de distro de extrair versão do kernel e construir data de 'uname -rv' (ou ferramenta similar)

1

Como muitos de vocês sabem, uname -r retorna o lançamento do kernel, enquanto uname -v retorna a versão (sinalizadores de compilação, data).

Estou tentando descobrir uma maneira de obter uma saída de SOMENTE o lançamento e a data de criação como

4.10.0-37-generic Fri Oct 6 22:42:22 UTC 2017

Se eu usar uname -rv , obtenho

4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017

Então, o que eu preciso aqui é encontrar um padrão para remover o #41~16.04.1-Ubuntu SMP . As únicas restrições para uma solução são:

  • tem que ser executável em uma única linha
  • a localidade do sistema é EUA (ou outra localidade inglesa em que os dias da semana e do mês são impressos em inglês)
  • tem que ser uma solução Linux distro e independente de distro. É por isso que optei por uname , pois, até onde eu sei, esta é uma ferramenta básica que está presente em todas as distribuições do Linux - Debian, Red Hat, Slackware, Arch etc. Outras ferramentas podem ser usadas se estiverem presentes em " todas as "distribuições por aí"
  • a ênfase está no Linux, o que significa que as soluções BSD (incluindo MacOS) não são relevantes.

O problema é que eu não estou familiarizado com o comando e especialmente se a maneira como a data é impressa é uniforme, eu considerei simplesmente remover a string após o primeiro espaço (da esquerda para a direita) até o sexto espaço ( incluído, da direita para a esquerda), mas isso funcionará APENAS se a data consistir em 5 espaços:

<day of the week> <month> <day of the month> <daytime (HH:MM:SS)> <time standard/time zone> <Year>

Outra coisa que eu considerei é usar a exclusão mútua entre a saída de uname -rv e cat /proc/version .

Linux version 4.10.0-37-generic (buildd@lcy01-30) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017
              |_______________|                                                                                                        |_________________________|


4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:22 UTC 2017
|_______________|                       |_________________________|

A expressão regular também deve ser uma opção aqui, no entanto, como eu mencionei acima, eu não sei se o formato da data é uniforme, portanto, fazer da expressão regular é bastante difícil (imho). Para isso, também podemos adicionar a natureza variável de uname -v , onde a subseqüência entre o # e a data pode ser muito diferente de um sistema para outro.

    
por rbaleksandar 15.11.2017 / 10:13

4 respostas

3

Existe o modo sed:

uname -rv | sed -e 's/\s#.*SMP//'

Eu tentei no Fedora / RHEL e parece funcionar corretamente também.

    
por 15.11.2017 / 10:22
0

Parece que você deseja simplesmente remover a segunda e terceira colunas separadas por espaço:

$ uname -rv | cut -d ' ' -f 1,4-
4.4.0-87-generic Tue Jul 18 12:55:35 UTC 2017

cut aqui interpretaria sua entrada como campos separados por espaço, e escolheria o primeiro campo em conjunto com qualquer campo a partir do quarto.

    
por 15.11.2017 / 10:19
0

Que tal:

echo $(uname -r)" "$(uname -v | sed -En 's/(^.*)((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun).*$)//p')
    
por 15.11.2017 / 10:44
0

E sobre

echo "$(uname -r)$(uname -v | sed -nE 's/.*(( \S+){6})$//p')"
    
por 06.05.2019 / 11:54