Bash 从标准输出中随机选取一行

Bash 从标准输出中随机选取一行,bash,random,Bash,Random,我有一个命令,它向标准输出许多行: $ listall foo bar baz 如何在一个内衬中(最好没有awk)从中提取一个随机条目,以便在管道中使用它: $ listall | pickrandom | sed ... | curl ... 谢谢 使用Perl: listall | shuf | head -n 1 perl-MList::Util=shuffle-e'print((shuffle)[0])” perl-e'print$listall[$key=int rand(@l

我有一个命令,它向标准输出许多行:

$ listall
foo
bar
baz
如何在一个内衬中(最好没有awk)从中提取一个随机条目,以便在管道中使用它:

$ listall | pickrandom | sed ... | curl ...
谢谢

使用Perl:

listall | shuf | head -n 1
  • 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”以外的其他工具


将以下内容另存为脚本(randomline.sh):

并将其作为

$ listall | randomline.sh

一些人抱怨在他们的安装中没有可用的
shuf
,因此这可能更容易访问:
listall | sort-R | head-n1

-R
是“随机排序”。

非常好,正是我需要的(我不知道shuf)-谢谢!实际上,“listall | shuf-n1”似乎足够了,谢谢。虽然这比使用shuf更复杂,但有时可能会派上用场。很高兴知道,谢谢!这与这个特殊的案例无关,但我以前甚至没有想过这个问题……我担心
-R
在OSX上不可用。
#! /bin/sh
set -- junk $(awk -v SEED=$$ 'BEGIN { srand(SEED) } { print rand(), $0 }' | sort -n | head -1)
shift 2
echo "$@"
$ listall | randomline.sh