Vamos repassar o que seu comando grep
faz primeiro:
- o
-o
indicagrep
para gerar apenas a parte correspondente em vez da linha inteira - o sinalizador
-E
permite o uso de expressões regulares estendidas -
'[^ ]+$'
corresponderá a qualquer caractere não espacial repetido uma ou mais vezes no final da linha - basicamente, uma palavra no final da linha.
Execução de teste:
$ cat input.txt
to be or not to be
that is the question
$ grep -oE '[^ ]+$' input.txt
be
question
Agora, como podemos fazer o mesmo em awk
? Bem, isso é bastante fácil, considerando que awk
opera por padrão em entradas separadas por espaços de cada linha (nós as chamamos de palavras - awk
as chama de campos). Assim, poderíamos imprimir $NF
com awk - pegar a variável NF
para o número de campos e tratá-la como se referindo a uma específica. Mas observe que o comando grep
corresponderia apenas a linhas não em branco, ou seja, há pelo menos uma palavra lá. Assim, precisamos de uma condição para awk
- operar somente nas linhas que possuem NF
de campos acima de zero.
awk 'NF{print $NF}' input.txt
Deve-se notar que o GNU awk, pelo menos, suporta o regex estendido (não estou familiarizado com os outros como extensivamente, por isso não vou fazer afirmações sobre os outros). Assim, podemos também escrever uma variação na resposta do cuonglm:
$ awk '{if(match($0,/[^ ]+$/)) print $NF}' input.txt
be
question
Com o GNU sed
também é possível usar expressões regulares estendidas - isso requer -r
flag, mas você não pode simplesmente usar a mesma expressão regular. Há uma necessidade de usar backreference com .
$ cat input.txt
to be or not to be
that is the question
blah
$ sed -r -e 's/^.* ([^ ]+)$//' input.txt
be
question
blah
É possível obter o resultado desejado com a expressão regular básica, assim:
$ cat input.txt
to be or not to be
that is the question
blah
$ sed 's/^.* \([^ ].*\)$//' input.txt
be
question
blah
Para mais informações, consulte estas postagens: