Nenhum cut
não pode fazer isso. Você poderia usar dois comandos rev
, como
echo 'foo bar baz' | rev | cut -d' ' -f1 | rev
mas geralmente é mais fácil usar awk
:
echo 'foo bar baz' | awk '{print $(NF)}'
Eu tenho uma string separada por espaço que é enviada por um comando, que eu gosto de canalizar para cut
, usando -fd ' '
para dividir em espaços. Eu sei que posso usar -f <n>
para exibir o número de campo <n>
, mas posso fazer com que ele exiba o último campo se eu não souber o tamanho da string?
Ou preciso usar uma ferramenta de edição de texto mais flexível, como sed
ou awk
?
Nenhum cut
não pode fazer isso. Você poderia usar dois comandos rev
, como
echo 'foo bar baz' | rev | cut -d' ' -f1 | rev
mas geralmente é mais fácil usar awk
:
echo 'foo bar baz' | awk '{print $(NF)}'
Você pode fazer isso usando apenas shell, nenhuma ferramenta externa é necessária, usando a Expansão de Parâmetros:
${var##* }
var##*
descartará tudo, desde o início até o último espaço do parâmetro (variável) var
.
Se o delimitador puder ser qualquer espaço em branco, espaço ou tabulação, use a classe de caractere [:blank:]
:
${var##*[[:blank:]]}
Exemplo:
$ var='foo bar spam egg'
$ echo "${var##* }"
egg
$ var=$'foo\tbar\tspam\tegg'
$ echo "$var"
foo bar spam egg
$ echo "${var##*[[:blank:]]}"
egg
Eu pessoalmente gosto da resposta de Florian Diesch. Mas também há esse caminho.
a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a
Explicação:
wc -w
indica o número de palavras. e cut
corta a última palavra
EDITAR:
Eu descobri outra maneira de fazer isso:
echo "Any random string here" | tac -s' ' | head -1
Aqui está um usando grep
$ echo "Change is Good" | grep -o '[^ ]*$'
Good
-o
Imprime somente as partes correspondentes (não vazias) de uma linha correspondente. [^ ]*$
corresponde a qualquer coisa desde o final até encontrar um espaço. Outro forro de glenn jackman usando o perl
$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
Tags command-line cut-command