Как найти последнее поле с помощью команды 'cut'
Как извлечь последнее поле из строки, когда количество полей неизвестно или изменяется на каждой строке, используя только команду cut
, без использования sed
или awk
?
5 ответ(ов)
Вы можете попробовать что-то подобное:
echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev
Объяснение
rev
переворачивает строку "maps.google.com" вmoc.elgoog.spam
cut
использует точку (т.е. '.') в качестве разделителя и выбирает первое поле, которое будетmoc
- в конце мы снова переворачиваем строку, чтобы получить
com
Без использования awk это можно сделать с помощью других команд. Рассмотрим пример с использованием rev
, cut
и tr
.
Вот один из способов:
echo 'maps.google.com' | rev | cut -d '.' -f 1 | rev
Здесь rev
переворачивает строку, cut
выбирает первое поле, разделенное точкой, а затем rev
снова переворачивает строку, чтобы вернуть оригинальный порядок.
Если вы хотите использовать только стандартные инструменты, вы можете прибегнуть к basename
, но в таком случае вам нужно будет делать некоторые манипуляции с результатом:
echo 'maps.google.com' | sed 's/.*\.//'
Эта команда sed
удаляет все символы до последней точки, оставляя только доменное имя верхнего уровня.
Конечно, awk
действительно мощный инструмент и часто позволяет делать такие вещи проще и элегантнее, однако, как видно, есть альтернативные способы, если вы хотите избежать его использования.
Существует несколько способов. Вы можете использовать и этот метод:
echo "Ваш текст здесь" | tr ' ' '\n' | tail -n1
здесь
Очевидно, что пробел в команде tr
следует заменить на тот разделитель, который вам нужен.
Это единственное возможное решение, которое использует только утилиту cut
:
echo "s.t.r.i.n.g." | cut -d'.' -f2-
**[повторять_следующую_часть_бесконечно_или_пока_не_закончится_память:]** | cut -d'.' -f2-
Используя это решение, количество полей действительно может быть неизвестно и изменяться с течением времени. Однако следует помнить, что длина строки не должна превышать значения LINE_MAX
, включая символ новой строки, поэтому произвольное количество полей не может стать реальным условием для данного решения.
Да, это довольно нелепое решение, но, на мой взгляд, оно единственное, которое соответствует заданным критериям.
При работе с табличными данными лучше использовать awk
. Если задачу можно решить с помощью awk
, то почему бы не воспользоваться этим инструментом? Я рекомендую не тратить впустую свое драгоценное время и использовать несколько команд для достижения результата.
Пример:
# $NF ссылается на последний столбец в awk
ll | awk '{print $NF}'
Как изменить цвет вывода echo в Linux
Как перенаправить вывод в файл и на экран (stdout)
Как работает "cat << EOF" в bash?
Как использовать 'grep' для непрерывного потока?
Как создать файл в Linux из терминала? [закрыто]