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