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

11

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

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

Arronical
источник
Я думаю, что команда cut не может поддерживать, но не уверен, вы пробовали использовать команду cut -d '' -f-?
αғsнιη 30.09.16
3
Больше способов сделать это: stackoverflow.com/questions/22727107/…
edwinksl
@KasiyA -nделает его n с самого начала, n-с n до конца, и есть --complementопция, которая изменяет выбор. Но нет никакого способа подсчитать количество полей и действовать, насколько я могу судить.
Arronical

Ответы:

12

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

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

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

echo 'foo bar baz' | awk '{print $(NF)}'
Флориан Диш
источник
7

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

${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
heemayl
источник
Я говорил об использовании расширения параметров в комментарии к ответу Северуса Такса, но пустой символьный класс - полезная информация, спасибо.
Arronical
4

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

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
Северус Тукс
источник
Правильно, но это верно, если в качестве разделителя используется пробел или табуляция, а если разделение не совпадает, это не удастся
αғsнιη
Хорошее боковое мышление, хотя, если я устанавливаю, a="my string here"я мог бы также использовать расширение параметров ${a##* }.
Arronical
1
Да, но ОП сказал, что у него есть строка, разделенная пробелом.
Северус Тукс
2

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

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

Как это работает:

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

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

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
souravc
источник