Existe o modo sed:
uname -rv | sed -e 's/\s#.*SMP//'
Eu tentei no Fedora / RHEL e parece funcionar corretamente também.
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:
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í" 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.
Existe o modo sed:
uname -rv | sed -e 's/\s#.*SMP//'
Eu tentei no Fedora / RHEL e parece funcionar corretamente também.
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.
Que tal:
echo $(uname -r)" "$(uname -v | sed -En 's/(^.*)((Mon)|(Tue)|(Wed)|(Thu)|(Fri)|(Sat)|(Sun).*$)//p')
E sobre
echo "$(uname -r)$(uname -v | sed -nE 's/.*(( \S+){6})$//p')"
Tags text-processing linux