Вход/Регистрация
UNIX — универсальная среда программирования
вернуться

Керниган Брайан Уилсон

Шрифт:

Посмотрим, чего можно достичь с помощью взаимодействия фильтров на примере конвейера, который печатает 10 наиболее часто встречающихся во входном потоке слов:

cat $* |

tr -sc A-Za-z '\012' |
Сжимаем все небуквы в перевод строки

sort |

uniq -с |

sort -n |

tail |

5

Команда

cat
собирает файлы, поскольку
tr
может читать только стандартный входной поток. Команда
tr
действует, как указано в справочном руководстве: она сжимает соседние, отличные от букв, символы в символы перевода строк, преобразуя таким образом входной поток в строки из одного слова. Затем слова сортируются и с помощью
uniq -с
каждая группа идентичных слов сжимается в одну строку, начинающуюся со счетчика, который используется как сортируемое поле в команде
sort -n
. (Эта последовательность двух команд сортировки, между которыми находится команда uniq, применяется так часто, что уже стала идиомой.) В результате получаются неповторяющиеся слова, отсортированные в порядке возрастания частоты появления в документе. Команда
tail
отбирает 10 наиболее часто встречающихся слов (т.е. конец отсортированного файла) и команда
5
печатает их в пять столбцов.

Заметьте, кстати, что введение символа

|
в конце строки — это законный способ ее продолжения.

Упражнение 4.3

Используя средства этого раздела и файл

/usr/dict/words
, составьте простой анализатор правильности написания текста на английском языке. Каковы его недостатки и как их исправить?

Упражнение 4.4

Напишите программу подсчета слов на предпочитаемом вами языке программирования. Сравните ее размер, скорость и самодокументированность с соответствующим конвейером. Насколько легко вы можете преобразовать эту программу в программу проверки правильности написания текста?

4.3 Потоковый редактор

sed

Вернемся теперь к редактору

sed
. Поскольку он происходит непосредственно от
ed
, вы легко изучите его и закрепите свои знания о редакторе
ed
. Основа редактора
sed
проста:

$ sed 'список команда ed' имена_файлов...

Читаются строки по одной из входных файлов; команды из списка применяются к каждой строке по одной в указанном порядке и результат редактирования записывается в стандартный выходной поток. Например, можно заменить в любом из указанных файлов

UNIX
на
UNIX (TM)
с помощью команды:

$ sed 's/\UNIX/\UNIX\ (TM)/g' имена_файлов...> выходной поток

Нужно правильно понимать действие команды. Она не изменяет содержимое своих входных файлов, а лишь пишет в стандартный выходной поток; исходные же файлы не изменяются. Вы уже достаточно разобрались в интерпретаторе, чтобы понять, что

$ sed '...' файл > файл

не лучшее решение: для замены содержимого файлов нужно задействовать временный файл или другую программу. В дальнейшем мы рассмотрим программу, реализующую задачу записи в существующий файл; обратитесь к команде

overwrite
в (гл. 5).

Редактор

sed
выдает все строки автоматически, поэтому команда
p
не нужна после ввода команды замены, приведенной выше; более того, если она задается, то каждая изменяемая строка печатается дважды. Однако кавычки необходимы почти всегда, поскольку многие метасимволы программы
sed
имеют специальные значения и для интерпретатора. Рассмотрим, например, команду
du -а
, порождающую список имен файлов. Обычно она выдает размер и имя файла:

$ du -a ch4*

18 ch4.1

13 ch4.2

14 ch4.3

17 ch4.4

 2 ch4.9

$

Можно использовать

sed
, чтобы отбросить размеры файлов, но в команде редактирования нужны кавычки для защиты символов
*
и табуляции от обработки интерпретатором:

$ du -a ch4.* | sed 's/.*->//'

ch4.1

ch4.2

ch4.3

ch4.4

ch4.9

$

В команде замены удаляются все символы (

.*
) до крайнего правого символа табуляции включительно (он показан в шаблоне как
– >
). Аналогичным способом можно выделить из вывода команды who имена пользователей и время входа в систему:

$ who

lr tty1 Sep 29 07:14

ron tty3 Sep 29 10:31

you tty4 Sep 29 08:36

td tty5 Sep 29 08:47

$ who | sed 's/ .* / /'

lr 07:14

ron 10:31

you 08:36

td 08:47

$

Команда

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

Почти такую же команду

sed
можно использовать, чтобы создать программу
getname
, возвращающую имя пользователя:

  • Читать дальше
  • 1
  • ...
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: