Книга: Искусство программирования на языке сценариев командной оболочки

Пример 12-10. Генератор 10-значных случайных чисел

Пример 12-10. Генератор 10-значных случайных чисел

#!/bin/bash

# rnd.sh: Генератор 10-значных случайных чисел

# Автор: Stephane Chazelas.

head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'

# =================================================================== #

# Описание

# --------

# head:

# -c4 -- первые 4 байта.

# od:

# -N4 ограничивает вывод 4-мя байтами.

# -tu4 беззнаковый десятичный формат вывода.

# sed:

# -n, в комбинации с флагом "p", в команде "s",

# выводит только совпадающие с шаблоном строки.

# Автор сценария описывает действия 'sed' таким образом:

# head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'

# ----------------------------------> |

# Передает вывод в "sed" --------> |

# пусть это будет 0000000 1198195154n

# sed начинает читать символы: 0000000 1198195154n.

# Здесь он находит символ перевода строки,

# таким образом он получает строку (0000000 1198195154).

# Затем он просматривает <диапазон><действие>. Первый и единственный -- это

# диапазон действие

# 1 s/.* //p

# Номер строки попадает в заданный лиапазон, так что теперь он приступает к выполнению действия:

# пытается заменить наибольшую подстроку, заканчивающуюся пробелом

# ("0000000 ") "ничем" (//), и если замена произведена -- выводит результат

# ("p" -- это флаг команды "s", а не команда "p", которая имеет иное значение).

# теперь sed готов продолжить чтение входного потока. (Обратите внимание:

# если опустить ключ -n, то sed выведет строку еще раз)

# Теперь sed дочитывает остаток строки.

# Он готов приступить к анализу 2-й строки (которая отмечена '$'

# как последняя).

# Поскольку строка не попадает в заданный <диапазон>, на этом обработка прекращается.

# Проще говоря, команда sed означает:

# "В первой строке удалить любые символы, вплоть до последнего встреченного пробела,

# и затем вывести остаток."

# Сделать это можно более простым способом:

# sed -e 's/.* //;q'

# Где, заданы два <диапазона><действия> (можно записать и по другому

# sed -e 's/.* //' -e q):

# диапазон действие

# ничего (для совпадающих строк) s/.* //

# ничего (для совпадающих строк) q (quit)

# Здесь sed считывает только первую строку.

# Выполняет оба действия, и выводит строку перед завершением

# (действие "q"), поскольку ключ "-n" опущен.

# =================================================================== #

# Простая альтернатива:

# head -c4 /dev/urandom| od -An -tu4

exit 0

См. также Пример 12-30.

tail

Выводит последние строки из файла на stdout (по-умолчанию -- 10 строк). Обычно используется для мониторинга системных журналов. Ключ -f, позволяет вести непрерывное наблюдение за добавляемыми строками в файл.

Оглавление книги


Генерация: 0.046. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз