微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从管道输入重击

如何解决从管道输入重击

| 我编写了一个琐碎的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 -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

解决方法

看到这里ksh:如何探测stdin?它用于ksh,但提供了bash的答案,要从文件中获取随机行,您可以执行以下操作:
awk \'BEGIN{srand();}{printf \"%04d %s\\n\",int(rand()*10000),$0}\' < $FILENAME | sort | cut -f2- -d\' \' | head -1
我们在这里做: 在每行的开头添加随机数 排序输出 从每行的开头删除随机数 打印第一行(混合输出) 顺便说一句,如果您使用的是BASH,则可以使用$ RANDOM(由bash提供)变量,而不用自己生成$ RAND。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。