Категории
Самые читаемые
PochitayKnigi » Компьютеры и Интернет » Программирование » Искусство программирования на языке сценариев командной оболочки - Мендель Купер

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 34 35 36 37 38 39 40 41 42 ... 96
Перейти на страницу:

usleep

Microsleep (здесь символ "u" должен читаться как буква греческого алфавита -- "мю", или префикс микро). Это то же самое, что и sleep, только интервал времени задается в микросекундах. Может использоваться для очень тонкой синхронизации процессов.

usleep 30

# Приостановка на 30 микросекунд.

Эта команда является частью пакета initscripts/rc-scripts в дистрибутиве Red Hat.

Команда usleep не обеспечивает особую точность соблюдения интервалов, и поэтому она не подходит для применений, критичных ко времени.

hwclock, clock

Команда hwclock используется для получения доступа или коррекции аппаратных часов компьютера. С некоторыми ключами требует наличия привилегий root. Сенарий /etc/rc.d/rc.sysinit использует команду hwclock для установки системного времени во время загрузки.

Команда clock -- это синоним команды hwclock.

12.4. Команды обработки текста

sort

Сортирует содержимое файла, часто используется как промежуточный фильтр в конвейерах. Эта команда сортирует поток текста в порядке убывания или возрастания, в зависимости от заданных опций. Ключ -m используется для сортировки и объединения входных файлов. В странице info перечислено большое количество возможных вариантов ключей. См. Пример 10-9, Пример 10-10 и Пример A-9.

tsort

Топологическая сортировка, считывает пары строк, разделенных пробельными символами, и выполняет сортировку, в зависимости от заданного шаблона.

uniq

Удаляет повторяющиеся строки из отсортированного файла. Эту команду часто можно встретить в конвейере с командой sort.

cat list-1 list-2 list-3 | sort | uniq > final.list

# Содержимое файлов,

# сортируется,

# затем удаляются повторяющиеся строки,

# и результат записывается в выходной файл.

Ключ -c выводит количество повторяющихся строк.

bash$ cat testfile

Эта строка встречается только один раз.

Эта строка встречается дважды.

Эта строка встречается дважды.

Эта строка встречается трижды.

Эта строка встречается трижды.

Эта строка встречается трижды.

bash$ uniq -c testfile

1 Эта строка встречается только один раз.

2 Эта строка встречается дважды.

3 Эта строка встречается трижды.

bash$ sort testfile | uniq -c | sort -nr

3 Эта строка встречается трижды.

2 Эта строка встречается дважды.

1 Эта строка встречается только один раз.

Команда sort INPUTFILE | uniq -c | sort -nr выводит статистику встречаемости строк в файле INPUTFILE (ключ -nr, в команде sort, означает сортировку в порядке убывания). Этот шаблон может с успехом использоваться при анализе файлов системного журнала, словарей и везде, где необходимо проанализировать лексическую структуру документа.

Пример 12-8. Частота встречаемости отдельных слов

#!/bin/bash

# wf.sh: "Сырой" анализ частоты встречаемости слова в текстовом файле.

ARGS=1

E_BADARGS=65

E_NOFILE=66

if [ $# -ne "$ARGS" ] # Файл для анализа задан?

then

echo "Порядок использования: `basename $0` filename"

exit $E_BADARGS

fi

if [ ! -f "$1" ] # Проверка существования файла.

then

echo "Файл "$1" не найден."

exit $E_NOFILE

fi

########################################################

# main ()

sed -e 's/.//g' -e 's/ /

/g' "$1" | tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr

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

# Подсчет количества вхождений

# Точки и пробелы заменяются

#+ символами перевода строки,

#+ затем символы переводятся в нижний регистр

#+ и наконец подсчитывается количество вхождений,

#+ и выполняется сортировка по числу вхождений.

########################################################

# Упражнения:

# ---------

# 1) Добавьте команду 'sed' для отсечения других знаков пунктуации, например, запятых.

# 2) Добавьте удаление лишних пробелов и других пробельных символов.

# 3) Добавьте дополнительную сортировку так, чтобы слова с одинаковой частотой встречаемости

#+ сортировались бы в алфавитном порядке.

exit 0

bash$ cat testfile

Эта строка встречается только один раз.

Эта строка встречается дважды.

Эта строка встречается дважды.

Эта строка встречается трижды.

Эта строка встречается трижды.

Эта строка встречается трижды.

bash$ ./wf.sh testfile

6 Эта

6 встречается

6 строка

3 трижды

2 дважды

1 только

1 один

1 раз

expand, unexpand

Команда expand преобразует символы табуляции в пробелы. Часто используется в конвейерной обработке текста.

Команда unexpand преобразует пробелы в символы табуляции. Т.е. она является обратной по отношению к команде expand.

cut

Предназначена для извлечения отдельных полей из текстовых файлов. Напоминает команду print $N в awk, но более ограничена в своих возможностях. В простейших случаях может быть неплохой заменой awk в сценариях. Особую значимость, для команды cut, представляют ключи -d (разделитель полей) и -f (номер(а) поля(ей)).

Использование команды cut для получения списка смонтированных файловых систем:

cat /etc/mtab | cut -d ' ' -f1,2

Использование команды cut для получения версии ОС и ядра:

uname -a | cut -d" " -f1,3,11,12

Использование команды cut для извлечения заголовков сообщений из электронных писем:

bash$ grep '^Subject:' read-messages | cut -c10-80

Re: Linux suitable for mission-critical apps?

MAKE MILLIONS WORKING AT HOME3

Spam complaint

Re: Spam complaint

Использование команды cut при разборе текстового файла:

# Список пользователей в /etc/passwd.

FILENAME=/etc/passwd

for user in $(cut -d: -f1 $FILENAME)

do

echo $user

done

# Спсибо Oleg Philon за этот пример.

cut -d ' ' -f2,3 filename эквивалентно awk -F'[ ]' '{ print $2, $3 }' filename

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

paste

Используется для объединения нескольких файлов в один многоколоночный файл.

join

Может рассматриваться как команда, родственная команде paste. Эта мощная утилита позволяет объединять два файла по общему полю, что представляет собой упрощенную версию реляционной базы данных.

Команда join оперирует только двумя файлами и объедияет только те строки, которые имеют общее поле (обычно числовое), результат объединения выводится на stdout. Объединяемые файлы должны быть отсортированы по ключевому полю.

File: 1.data

100 Shoes

200 Laces

300 Socks

File: 2.data

100 $40.00

200 $1.00

300 $2.00

bash$ join 1.data 2.data

File: 1.data 2.data

100 Shoes $40.00

200 Laces $1.00

300 Socks $2.00

На выходе ключевое поле встречается только один раз.

head

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

Пример 12-9. Какие из файлов являются сценариями?

#!/bin/bash

# script-detector.sh: Отыскивает файлы сценариев в каталоге.

TESTCHARS=2 # Проверяются первые два символа.

SHABANG='#!' # Сценарии как правило начинаются с "sha-bang."

for file in * # Обход всех файлов в каталоге.

do

if [[ `head -c$TESTCHARS "$file"` = "$SHABANG" ]]

# head -c2 #!

# Ключ '-c' в команде "head" выводит заданное

1 ... 34 35 36 37 38 39 40 41 42 ... 96
Перейти на страницу:
Тут вы можете бесплатно читать книгу Искусство программирования на языке сценариев командной оболочки - Мендель Купер.
Комментарии