Existe alguma maneira de fazer o comando de corte ler apenas o último campo?

6

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 ?

    
por Arronical 30.09.2016 / 14:09

4 respostas

8

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)}'
    
por Florian Diesch 30.09.2016 / 14:15
5

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
    
por heemayl 30.09.2016 / 16:00
4

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
    
por Severus Tux 30.09.2016 / 14:29
2

Aqui está um usando grep

$ echo "Change is Good" | grep -o '[^ ]*$'
Good

Como funciona:

  • grep with -o Imprime somente as partes correspondentes (não vazias) de uma linha correspondente.
  • O regexp [^ ]*$ 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
    
por souravc 30.09.2016 / 14:55