Есть ли способ заставить команду вырезать чтение только последнего поля?

У меня есть разделенная пробелами строка, которая выводится командой, которую я хотел бы передать cut, с помощью -fd ' ' разделить на пробелы. Я знаю, что могу использовать -f <n> отображать номер поля <n>, но я могу заставить это отображать последнее поле, если я не знаю длину строки?

Или мне нужно использовать более гибкий инструмент для редактирования текста, как sed или же awk?

4 ответа

Решение

Нет cut не могу этого сделать. Вы могли бы использовать два rev команды, как

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

но обычно проще в использовании awk:

echo 'foo bar baz' | awk '{print $(NF)}'

Вы можете сделать это, используя только оболочку, никакой внешний инструмент не требуется, используя Расширение Параметра:

${var##* }

var##* будет отбрасывать все от начала до последнего пробела от параметра (переменной) var,

Если разделителем может быть любой пробел, например пробел или табуляция, используйте класс символов [:blank:]:

${var##*[[:blank:]]}

Пример:

$ var='foo bar spam egg'

$ echo "${var##* }"
egg


$ var=$'foo\tbar\tspam\tegg'

$ echo "$var"
foo    bar    spam    egg

$ echo "${var##*[[:blank:]]}"
egg

Мне лично нравится Флориан Диш ответ. Но есть и этот способ.

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

Объяснение:

wc -w дает количество слов. а также cut режет последнее слово

РЕДАКТИРОВАТЬ:

Я понял другой способ сделать это:

echo "Any random string here" | tac -s' ' | head -1

Вот один, используя grep

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

Как это устроено:

  • с -o Печатайте только совпадающие (непустые) части совпадающей строки.
  • Регулярное выражение [^ ]*$ соответствует чему-либо от конца, пока он не нашел пробел.

Еще один лайнер от Гленна Джекмана с использованием Perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
Другие вопросы по тегам