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

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

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

1
задан 30 September 2016 в 15:21

3 ответа

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

${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
5
ответ дан 23 May 2018 в 05:37
  • 1
    Я говорил об использовании расширения параметров в комментарии к ответу Северуса Тукса, но пустой класс символов - полезная информация, спасибо. – Arronical 2 October 2016 в 00:19

Мне лично нравится ответ Флориана Диша. Но это тоже так.

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

Объяснение:

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

EDIT:

Я понял другой способ:

echo "Any random string here" | tac -s' ' | head -1
4
ответ дан 23 May 2018 в 05:37
  • 1
    Правильно, но это верно, когда delim - это пробел или табуляция, и если ваш cut delim не то же самое, это не удастся – αғsнιη 30 September 2016 в 15:40
  • 2
    Хорошее боковое мышление, хотя, если я устанавливаю a="my string here", я мог бы использовать расширение параметра ${a##* }. – Arronical 30 September 2016 в 15:41
  • 3
    Да, но ОП сказал, что у него есть пробел, разделенный пробелом. – Severus Tux 30 September 2016 в 15:41

Здесь используется grep

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

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

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

Еще один лайнер от glenn jackman с использованием perl

$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good
2
ответ дан 23 May 2018 в 05:37

Другие вопросы по тегам:

Похожие вопросы: