5W site logo 5W - мой домашний сайт-блог с картинками, кино и плюшками.

random-file.txt

выбираем случайный файл или строку в файле

Конечно, все мы бесконечно ценим свободу. В частности, свободу выбора. Но иной раз она тяготит. Заглянул, например, в папку с видео, а там куча фильмов непросмотренных. На чем остановиться, что выбрать? Вот же досада! Так и хочется достать монетку и простой случайностью «орел-решка» решить проблему, но, увы и ах, не найти монету с 20-30-40-?? сторонами. К счастью, в Linux есть такая «монетка». Кому интересно — под кат.

Ничего устанавливать не нужно. Всё уже есть, в любом дистрибутиве Linux. Это команда «shuf» — генератор случайных значений. Полностью ознакомиться с ее функционалом можно набрав «man shuf», я же расскажу о двух конкретных примерах.
Итак, возвращаемся в нашу папку с фильмами («cd /home/user/video», например) и вводим следующее:

ls | shuf -n1

Первая часть всем должна быть уже знакома, команда ls выдает нам содержимое папки. Далее, мы с помощью вертикальной черты направляем вывод команды ls команде shuf, которая случайным образом выбирает одну строку из этого вывода. То есть, один файл из всего содержимого папки (вернее, его название). Случайный. Хотите не один, а пару или больше? Ок, вместо "-n1" напишите "-n2" или "-n3" или другое значение.
Второй пример. У нас в наличии список чего-нибудь. Находится он в обычном текстовом файле. Набираем в консоли:

cat spisok.txt | shuf -n1

Все то же самое, только вместо папки у нас текстовый файл. Команда cat выводит в терминал содержимое файла, а команда shuf выбирает из этого содержимого случайную строку.
Вот и все. Очевидно, что можно придумать и другие варианты использования.
----------------------------------------------
random 1-10:

shuf -i1-10 -n1
--------------------------------------------------

You can also use /dev/urandom:

grep -m1 -ao '[0-9]' /dev/urandom | sed s/0/10/ | head -n1
---------------------------------------------------------

Useful when you don't have $RANDOM available, i.e. busybox –
To generate in the range: {0,..,9}

r=$(( $RANDOM % 10 )); echo $r

To generate in the range: {40,..,49}

r=$(( $RANDOM % 10 + 40 )); echo $r
--------------------------------------------------------
you can also get random number from awk

awk 'BEGIN {
# seed
srand()
for (i=1;i<=1000;i++){
print int(1 + rand() * 100)
}
}'