【问题标题】:Bash input from pipe来自管道的 Bash 输入
【发布时间】:2011-04-19 02:28:32
【问题描述】:

我编写了一个简单的 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

【问题讨论】:

标签: bash shell scripting pipe stdin


【解决方案1】:

要从文件中获取随机行,您可以这样做:

awk 'BEGIN{srand();}{printf "%04d %s\n", int(rand()*10000), $0}' < $FILENAME | sort | cut -f2- -d' ' | head -1

我们这样做:

  1. 在每行的开头添加随机数
  2. 排序输出
  3. 从每行的开头删除随机数
  4. 打印第一行(混合输出)

顺便说一句,如果您使用 BASH,则可以使用 $RANDOM(由 bash 提供)变量,而不是自己生成 $RAND。

【讨论】:

    【解决方案2】:

    请参阅此处ksh: how to probe stdin? 它是针对 ksh,但提供了针对 bash 的答案

    【讨论】:

      猜你喜欢
      • 2012-01-28
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 2015-10-08
      • 1970-01-01
      • 2017-02-22
      相关资源
      最近更新 更多