5

Как найти последнее поле с помощью команды 'cut'

16

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

5 ответ(ов)

11

Вы можете попробовать что-то подобное:

echo 'maps.google.com' | rev | cut -d'.' -f 1 | rev

Объяснение

  • rev переворачивает строку "maps.google.com" в moc.elgoog.spam
  • cut использует точку (т.е. '.') в качестве разделителя и выбирает первое поле, которое будет moc
  • в конце мы снова переворачиваем строку, чтобы получить com
1

Без использования 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 действительно мощный инструмент и часто позволяет делать такие вещи проще и элегантнее, однако, как видно, есть альтернативные способы, если вы хотите избежать его использования.

0

Существует несколько способов. Вы можете использовать и этот метод:

echo "Ваш текст здесь" | tr ' ' '\n' | tail -n1

здесь

Очевидно, что пробел в команде tr следует заменить на тот разделитель, который вам нужен.

0

Это единственное возможное решение, которое использует только утилиту cut:

echo "s.t.r.i.n.g." | cut -d'.' -f2-
  **[повторять_следующую_часть_бесконечно_или_пока_не_закончится_память:]** | cut -d'.' -f2-

Используя это решение, количество полей действительно может быть неизвестно и изменяться с течением времени. Однако следует помнить, что длина строки не должна превышать значения LINE_MAX, включая символ новой строки, поэтому произвольное количество полей не может стать реальным условием для данного решения.

Да, это довольно нелепое решение, но, на мой взгляд, оно единственное, которое соответствует заданным критериям.

0

При работе с табличными данными лучше использовать awk. Если задачу можно решить с помощью awk, то почему бы не воспользоваться этим инструментом? Я рекомендую не тратить впустую свое драгоценное время и использовать несколько команд для достижения результата.

Пример:

# $NF ссылается на последний столбец в awk
ll | awk '{print $NF}'
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь