簡體   English   中英

來自管道的Bash輸入

[英]Bash input from pipe

我寫了一個簡單的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 -

如何才能做到這一點?

編輯:
感謝Doon!

#!/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

我們在這里:

  1. 將隨機數添加到每行的開頭
  2. 排序輸出
  3. 從每行的開頭刪除隨機數
  4. 打印第一行(混合輸出)

順便說一句,如果你使用BASH,你可以使用$ RANDOM(由bash提供)變量,而不是自己生成$ RAND。

看到這里ksh:如何探測stdin? 它適用於ksh,但提供了bash的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM