Есть ли способ заставить команду вырезать чтение только последнего поля?
У меня есть разделенная пробелами строка, которая выводится командой, которую я хотел бы передать 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