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

shuf

Перемешать строки, выбрать случайные строки или числа, сгенерировать выборку с повторами

shuf выводит строки в случайном порядке. С -n берёт случайную выборку, с -i перемешивает диапазон чисел, с -e — свои аргументы. Нужен для тестовых данных, случайного выбора сервера или файла, выборки строк из большого лога.

Синтаксис

shuf [опции] [файл]            # строки файла или стандартного ввода
shuf -e [опции] [аргумент…]    # каждый аргумент — строка
shuf -i ОТ-ДО [опции]          # числа из диапазона

shuf принимает один файл. Для нескольких склей их заранее: cat a b | shuf.

Опции

Источник строк

ОпцияЧто делает
(файл или -)строки файла или стандартного ввода
-e арг…каждый аргумент — отдельная строка
-i ОТ-ДОчисла от ОТ до ДО включительно, по одному в строке
-zстроки разделены нулевым байтом, а не \n (пара для find -print0)

Сколько и как выбирать

ОпцияЧто делает
-n Nвывести не больше N строк — случайная выборка без повторов
-rвыборка с повторами: одна строка может выпасть несколько раз. Без -n выводит бесконечно
-o файлзаписать результат в файл (можно в тот же, что на входе)
--random-source=файлбрать случайные байты из файла — для воспроизводимого результата

Примеры

seq 10 > items.txt

# перемешать строки
shuf items.txt

# одна случайная строка
shuf -n 1 items.txt

# три случайных числа от 1 до 100 без повторов
shuf -i 1-100 -n 3

# выбор из вариантов
shuf -n 1 -e red green blue

# 5 бросков монетки — с повторами
shuf -r -n 5 -e H T

# 10 бросков кубика
shuf -r -n 10 -i 1-6

# перемешать файл на месте
shuf -o items.txt items.txt

# случайная выборка 100 строк из лога
shuf -n 100 /var/log/dpkg.log

# воспроизводимый порядок: одинаковое «зерно» — одинаковый результат
seeded() { openssl enc -aes-256-ctr -pass pass:"$1" -nosalt </dev/zero 2>/dev/null; }
shuf -n 3 --random-source=<(seeded 42) items.txt
shuf -n 3 --random-source=<(seeded 42) items.txt   # то же самое

# случайный файл из каталога (имена с пробелами — через -z)
find /etc -maxdepth 1 -type f -print0 | shuf -z -n 1 | tr '\0' '\n'

Подводные камни

  • -r без -n никогда не остановится: shuf -r -e a b печатает бесконечно. Всегда ограничивай -n или head.
  • -n больше числа строк — не ошибка. shuf -i 1-3 -n 10 выведет три числа: без -r повторов нет, а взять больше негде.
  • Второй файл — ошибка: shuf a b выдаёт extra operand 'b'. Склей файлы через cat.
  • shuf файл > файл обнулит файл до чтения. Для записи на месте есть -o файл.
  • --random-source с коротким файлом падает с end of file: случайных байт нужно много. Обычный файл как «зерно» годится только большой; надёжнее генерировать поток из пароля через openssl enc, как в примере.
  • Пустой ввод — не ошибка. shuf -e без аргументов и shuf -n 1 на пустом файле ничего не печатают и возвращают 0. Проверяй результат, прежде чем подставлять его в команду.
  • -i принимает только неотрицательные целые по возрастанию: shuf -i 5-1 — ошибка invalid input range.

См. также

seq · sort · head и tail · find · openssl