У меня есть команда, которая извергает много строк к stdout:
$ listall
foo
bar
baz
Как делают я извлекаю случайную запись из этого в остроте (предпочтительно без awk), таким образом, я могу просто использовать его в канале:
$ listall | pickrandom | sed ... | curl ...
Спасибо!
Использование Perl:
perl -MList :: Util = shuffle -e'print ((shuffle <>) [0]) '
perl -e'print $ listall [$ key = int rand (@ listall = <>)] '
Это безопасно для памяти, в отличие от использования shuf или List :: Util shuffle:
listall | awk 'BEGIN {srand ()} int (rand () * NR) == 0 {x = $ 0} END {print x}'
Это имело бы значение только в том случае, если listall мог вернуть огромный результат.
Для получения дополнительной информации см. Запись DADS о отборе проб коллектора .
вы можете сделать это с помощью bash, без других инструментов, кроме listall
$ lists=($(listall)) # put to array
$ num=${#lists[@]} # get number of items
$ rand=$((RANDOM%$num)) # generate random number
$ echo ${lists[$rand]}
Сохраните следующее как сценарий (randomline.sh):
#! /bin/sh
set -- junk $(awk -v SEED=$$ 'BEGIN { srand(SEED) } { print rand(), $0 }' | sort -n | head -1)
shift 2
echo "$@"
и запустите его как
$ listall | randomline.sh