É simples, curto e fácil de escrever, entender e verificar, e eu pessoalmente gosto:
grep -oE '\S+$' file
grep
no Ubuntu , quando chamado com -E
ou -P
, usa a abreviação \s
para significar um caractere de espaço em branco (na prática geralmente um espaço ou guia) e \S
para significar qualquer coisa que não seja um. Usando o quantificador+
e a âncora de fim de linha$
, o padrão \S+$
corresponde a um ou mais não espaços em branco no final de uma linha . Você pode usar em -P
vez de -E
; o significado nesse caso é o mesmo, mas um mecanismo diferente de expressões regulares é usado; portanto, eles podem ter características de desempenho diferentes .
Isso é equivalente à solução comentada de Avinash Raj (apenas com uma sintaxe mais fácil e mais compacta):
grep -o '[^[:space:]]\+$' file
Essas abordagens não funcionarão se houver espaço em branco após o número. Eles podem ser modificados, mas não vejo sentido em entrar aqui. Embora às vezes seja instrutivo generalizar uma solução para funcionar em mais casos, não é prático fazê-lo com a frequência que as pessoas supõem, porque geralmente não há como saber de que maneiras diferentes e incompatíveis o problema pode precisar. ser generalizado.
Às vezes, o desempenho é uma consideração importante. Esta pergunta não estipula que a entrada seja muito grande e é provável que todos os métodos publicados aqui sejam rápidos o suficiente. No entanto, caso a velocidade seja desejada, aqui está uma pequena referência em um arquivo de entrada de dez milhões de linhas:
$ perl -e 'print((<>) x 2000000)' file > bigfile
$ du -sh bigfile
439M bigfile
$ wc -l bigfile
10000000 bigfile
$ TIMEFORMAT=%R
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
819.565
$ time grep -oE '\S+$' bigfile > bigfile.out
816.910
$ time grep -oP '\S+$' bigfile > bigfile.out
67.465
$ time cut -d= -f2 bigfile > bigfile.out
3.902
$ time grep -o '[^[:space:]]\+$' bigfile > bigfile.out
815.183
$ time grep -oE '\S+$' bigfile > bigfile.out
824.546
$ time grep -oP '\S+$' bigfile > bigfile.out
68.692
$ time cut -d= -f2 bigfile > bigfile.out
4.135
Executei-o duas vezes, caso a ordem importasse (como às vezes é importante para tarefas pesadas de E / S) e porque não havia uma máquina disponível que não estivesse fazendo outras coisas em segundo plano que poderiam distorcer os resultados. A partir desses resultados, concluo o seguinte, pelo menos provisoriamente e para arquivos de entrada do tamanho que usei:
Uau! Passando -P
(para usar PCRE ) em vez de -G
(o padrão quando nenhum dialeto é especificado) ou -E
tornado grep
mais rápido em uma ordem de magnitude. Portanto, para arquivos grandes, pode ser melhor usar este comando do que o mostrado acima:
grep -oP '\S+$' file
UAU!! O cut
método de resposta de αғsнιη , é mais de uma ordem de grandeza mais rápido do que até mesmo a versão mais rápida do meu caminho! Também foi o vencedor no benchmark do pa4080 , que abrangeu mais métodos do que isso, mas com menor contribuição - e é por isso que eu o escolhi, dentre todos os outros métodos, para incluir no meu teste. Se o desempenho é importante ou os arquivos são enormes, acho que o método de αғsнιη deve ser usado.cut -d= -f2 file
cut
Isso também serve como um lembrete de que o simples cut
e os paste
utilitários não devem ser esquecidos , e talvez devam ser preferidos quando aplicável, embora existam ferramentas mais sofisticadas como grep
essas que são frequentemente oferecidas como soluções de primeira linha (e que eu pessoalmente estou mais acostumado para usar).
grep -o '[^[:space:]]\+$' file