← Весь справочник

rev

Развернуть каждую строку задом наперёд; трюк «последнее поле» и разворот порядка полей

rev переворачивает каждую строку посимвольно: hello → olleh. Порядок строк не меняется (для этого есть tac). Сам по себе rev нужен редко, но в паре с cut он решает частую задачу — взять последнее поле, когда число полей заранее неизвестно.

Синтаксис

rev [файл…]

Без файлов читает стандартный ввод. Опций для работы почти нет: только -h (справка) и -V (версия). rev входит в util-linux.

Что разворачивается

ВводВыводКомментарий
helloollehсимволы в обратном порядке
a<TAB>bb<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-).

См. также

cut · cat и tac · awk · tr · paste