Existe alguma maneira de fazer com que o comando recorte leia apenas o último campo?

10

Eu tenho uma string separada por espaço que é produzida por um comando, que eu gosto de canalizar cut, usando -fd ' 'para dividir em espaços. Sei que posso usar -f <n>para exibir o número do campo <n>, mas posso exibir o último campo se não souber o comprimento da string?

Ou preciso usar uma ferramenta de edição de texto mais flexível como sedou awk?

Arronical
fonte
Acho que o comando cut não pode suportar, mas não tenho certeza, você tentou com cut -d '' -f-?
αғsнιη
3
Mais maneiras de fazer isso: stackoverflow.com/questions/22727107/...
edwinksl
@KasiyA -ntorna o n desde o início, n-é de n até o fim e existe a --complementopção que inverte a seleção. Mas não há como contar o número de campos e agir de acordo com o que sei.
Arronical 30/09/16

Respostas:

12

Não, cutnão posso fazer isso. Você pode usar dois revcomandos, como

echo 'foo bar baz' | rev | cut -d' ' -f1 | rev

mas geralmente é mais fácil de usar awk:

echo 'foo bar baz' | awk '{print $(NF)}'
Florian Diesch
fonte
7

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 ter algum espaço em branco, como 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
heemail
fonte
Eu falei sobre o uso da expansão de parâmetros em um comentário sobre a resposta de Severus Tux, mas a classe de caracteres em branco é uma informação útil, obrigado.
Arronical
4

Pessoalmente, gosto da resposta de Florian Diesch. Mas existe esse caminho também.

a=$(echo "your string here" | wc -w)
echo "your string here" | cut -d' ' -f$a

Explicação:

wc -wdá o número de palavras. e cutcorta a última palavra

EDITAR:

Imaginei outra maneira de fazê-lo:

echo "Any random string here" | tac -s' ' | head -1
Severus Tux
fonte
Correto, mas isso é verdade quando delim é espaço ou tabulação, e se o seu delim corte não é o mesmo, este irá falhar
αғsнιη
Bom pensamento lateral, embora, se eu estiver configurando, a="my string here"também possa usar a expansão de parâmetros ${a##* }.
Arronical 30/09/16
1
Sim, mas o OP disse que ele tinha uma string separada por espaço.
Severus Tux
2

Aqui está um usando grep

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

Como funciona:

  • grep com -oImprime apenas 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 liner de glenn jackman usando perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
souravc
fonte