来自管道的Bash输入
我编写了一个简单的bash脚本,它转储文件或STDIN中的随机行:来自管道的Bash输入,bash,shell,scripting,pipe,stdin,Bash,Shell,Scripting,Pipe,Stdin,我编写了一个简单的bash脚本,它转储文件或STDIN中的随机行: #!/bin/bash if [ $# -ne 1 ] then echo "Syntax: $0 FILE (or \'-\' for STDIN)" echo $0 - display a random line from FILE exit 1 fi RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut
#!/bin/bash
if [ $# -ne 1 ]
then
echo "Syntax: $0 FILE (or \'-\' for STDIN)"
echo $0 - display a random line from FILE
exit 1
fi
RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2`
if [ $1 != "-" ]
then
LINES=`cat "$1" | wc -l`
LINE=`expr $RAND % $LINES + 1`
head -$LINE $1 | tail -1
else
piped=`cat -`
LINES=`echo "$piped" | wc -l`
LINE=`expr $RAND % $LINES + 1`
echo "$piped" | head -$LINE | tail -1
fi
然而,若并没有传递任何选项,我希望它也能处理STDIN(但若并没有来自管道的STDIN,在帮助下仍然会失败)
也就是说,我想说:
echo "foo\nbar\nbaz" | randline
。。。而不是
echo "foo\n\bar\nbaz" | randline -
如何做到这一点
编辑:多亏了杜恩
#!/bin/bash
if [ "$( tty )" == 'not a tty' ]
then
STDIN_DATA_PRESENT=1
else
STDIN_DATA_PRESENT=0
fi
if [[ $# -ne 1 && $STDIN_DATA_PRESENT -eq 0 ]]
then
echo "Syntax: $0 [FILE (or \'-\' for STDIN)]"
echo $0 - display a random line from FILE
echo -e "\nWill also process piped STDIN if no arguments are given."
exit 1
fi
RAND=`cat /proc/sys/kernel/random/uuid | cut -c1-4 | od -d | head -1 | cut -d' ' -f2`
if [[ $1 && $1 != "-" ]]
then
LINES=`cat "$1" | wc -l`
LINE=`expr $RAND % $LINES + 1`
head -$LINE $1 | tail -1
else
piped=`cat -`
LINES=`echo "$piped" | wc -l`
LINE=`expr $RAND % $LINES + 1`
echo "$piped" | head -$LINE | tail -1
fi
要从文件中获取随机行,可以执行以下操作:
awk 'BEGIN{srand();}{printf "%04d %s\n", int(rand()*10000), $0}' < $FILENAME | sort | cut -f2- -d' ' | head -1
awk'BEGIN{srand();}{printf“%04d%s\n”,int(rand()*10000),$0}'<$FILENAME | sort | cut-f2--d'| head-1
我们在这里做:
顺便说一句,如果您使用的是BASH,您可以使用$RANDOM(由BASH提供)变量,而不是自己生成$RAND。请看这里它是针对ksh的,但提供了一个BASH的答案请看这里它是针对ksh的,但提供了针对BASH的答案。您应该从问题中删除该解决方案并将其添加为答案(如果它真的解决了你的问题,就接受它)。