rev
Развернуть каждую строку задом наперёд; трюк «последнее поле» и разворот порядка полей
rev переворачивает каждую строку посимвольно: hello → olleh. Порядок строк не меняется (для этого есть tac). Сам по себе rev нужен редко, но в паре с cut он решает частую задачу — взять последнее поле, когда число полей заранее неизвестно.
Синтаксис
rev [файл…]
Без файлов читает стандартный ввод. Опций для работы почти нет: только -h (справка) и -V (версия). rev входит в util-linux.
Что разворачивается
| Ввод | Вывод | Комментарий |
|---|---|---|
hello | olleh | символы в обратном порядке |
a<TAB>b | b<TAB>a | табуляция — обычный символ |
x\r (строка из Windows) | \rx | \r переезжает в начало строки |
abc без \n в конце | cba без \n | перевод строки не добавляется |
абв | вба | только в UTF-8-локали (см. подводные камни) |
Трюки
| Задача | Команда |
|---|---|
| последнее поле | rev | cut -d/ -f1 | rev |
| всё, кроме последнего поля | rev | cut -d. -f2- | rev |
| последние N символов строки | rev | cut -c1-N | rev |
| поля в обратном порядке (не символы!) | awk '{for(i=NF;i>0;i--) printf "%s%s", $i, (i>1?OFS:ORS)}' |
| слова в обратном порядке через стандартные утилиты | tr ' ' '\n' | tac | paste -sd' ' |
Примеры
# развернуть строку
echo 'hello' | rev
# имя файла из пути — последнее поле
echo /var/log/nginx/access.log | rev | cut -d/ -f1 | rev
# путь без имени файла
echo /var/log/nginx/access.log | rev | cut -d/ -f2- | rev
# убрать последнее расширение
echo backup.tar.gz | rev | cut -d. -f2- | rev
# последние 4 символа каждой строки
printf '2026-10-13\n2025-01-01\n' | rev | cut -c1-4 | rev
# поля в обратном порядке — это работа awk, а не rev
echo 'one two three' | awk '{for(i=NF;i>0;i--) printf "%s%s", $i, (i>1?OFS:ORS)}'
# то же через tr, tac и paste (одна строка на входе)
echo 'one two three' | tr ' ' '\n' | tac | paste -sd' '
# палиндром ли строка
s=level; [ "$s" = "$(echo "$s" | rev)" ] && echo palindrome
# кириллица — только с UTF-8-локалью
echo 'привет' | LC_ALL=C.UTF-8 rev
Подводные камни
- В локали
Cна не-ASCII текстеrevзависает. В песочнице локаль по умолчаниюC, иecho привет | revне завершается, пока не прервёшь его Ctrl+C. Для кириллицы и любого UTF-8 запускайLC_ALL=C.UTF-8 rev. revразворачивает символы, а не слова.echo 'one two' | revдастowt eno. Чтобы поменять порядок полей, бери awk или связкуtr/tac/paste.revне меняет порядок строк — этоtac(см. cat и tac).\rна конце строки уезжает в начало. Файлы из Windows сначала очисти от\r(tr -d '\r'), иначе после двойногоrevиcutв начале значения окажется невидимый\r.- Для «последнего поля» есть способы проще.
awk -F/ '{print $NF}',basename,${path##*/}в bash — читаются лучше. Трюк сrevполезен, когда нужен именно cut с его диапазонами (-f2-).