Isso é simples, curto e fácil de escrever, entender e verificar, e eu pessoalmente gosto disso:
grep -oE '\S+$' file
grep
no Ubuntu , quando invocado com -E
ou -P
, recebe o < uma abreviação \s
para significar um espaço em branco (na prática geralmente um espaço ou tab) e \S
para significar qualquer coisa que não seja um. Usando o o quantificador +
e a âncora de final de linha $
, o padrão \S+$
corresponde a um ou mais não-brancos no final de uma linha . Você pode usar -P
em vez de -E
; o significado neste caso é o mesmo, mas um mecanismo diferente de expressões regulares é usado, então eles pode ter diferentes características de desempenho .
Isso é equivalente a Avinash Solução comentada de 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. Elas podem ser modificadas, mas não vejo sentido em entrar aqui. Embora às vezes seja instrutivo generalizar uma solução para trabalhar em mais casos, não é prático fazer isso com tanta frequência quanto as pessoas tendem a supor, porque geralmente não há como saber em quais das diferentes maneiras incompatíveis o problema pode acabar por ser generalizado.
O desempenho às vezes é uma consideração importante. Esta pergunta não estipula que a entrada é 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
Eu o executei duas vezes no caso de o pedido ser importante (como às vezes acontece em tarefas pesadas de E / S) e porque não tinha uma máquina disponível que não estivesse fazendo outras coisas em segundo plano que pudessem 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
fez grep
mais rápido em uma ordem de grandeza. Portanto, para arquivos grandes, pode ser melhor usar esse comando do que o mostrado acima:
grep -oP '\S+$' file
-
WOW !! O método cut
em resposta da αғsнιη , cut -d= -f2 file
, é mais de uma ordem de magnitude mais rápida do que a versão mais rápida do meu caminho! Foi o vencedor no benchmark do pa4080 também, que cobriu mais métodos do que isso, mas com menor participação - e é por isso que Eu escolhi, de todos os outros métodos, para incluir no meu teste. Se o desempenho é importante ou os arquivos são enormes, eu acho que o método cut
deve ser usado.
Isso também serve como um lembrete de que o simples cut
e paste
utilitários não deve ser esquecido , e talvez deva ser preferido quando aplicável, mesmo que existam ferramentas mais sofisticadas como grep
que geralmente são oferecidos como soluções de primeira linha (e que eu pessoalmente estou mais acostumado a usar) .