У меня есть строка, разделенная пробелом, которая выводится командой, которую я хотел бы передать на cut, используя -fd ' ' для разделения на пробелы. Я знаю, что я могу использовать -f <n> для отображения номера поля <n>, но могу ли я отобразить последнее поле, если я не знаю длину строки?
Или мне нужно использовать более гибкий инструмент для редактирования текста, такой как sed или awk?
Вы можете сделать это, используя только оболочку, внешний инструмент не требуется, используя параметр 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
Мне лично нравится ответ Флориана Диша. Но это тоже так.
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
Здесь используется grep
$ echo "Change is Good" | grep -o '[^ ]*$'
Good
Еще один лайнер от glenn jackman с использованием perl
$ echo "Change is Good" | perl -lane 'print $F[-1]'
Good