Bash вход из трубы - PullRequest
       16

Bash вход из трубы

3 голосов
/ 19 апреля 2011

Я написал тривиальный скрипт 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

Ответы [ 2 ]

2 голосов
/ 19 апреля 2011

Чтобы получить случайную строку из файла, вы можете сделать:

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 самим собой.

1 голос
/ 19 апреля 2011

см. Здесь ksh: как проверить стандартный ввод? это для ksh, но дан ответ для bash

...