Командные строки и конвейеры

Последовательность команд, разделенных вертикальными чертами (|), образует конвейер. В конвейере, состоящем более чем из одной команды, каждая команда выполняется как отдельный процесс, связанный с соседними с помощью программных каналов - т.е. вывод каждой команды (за исключением последней) становится вводом для следующей команды в строке.
Фильтр - это команда, которая считывает стандартный ввод, преобразует его некоторым образом и затем записывает в стандартный вывод. Конвейер, как правило, состоит из последовательности фильтров. Несмотря на то, что процессы в конвейере могут выполняться параллельно, каждой программе необходимо прочитать вывод предыдущей. Многие команды работают с отдельными строками текста - считывают их, обрабатывают, записывают и возвращаются назад для считывания новых строк. Некоторые команды должны наоборот сначала считать большой объем данных и потом только начинают выводить результаты - sort является примером такой команды, которой требуется вначале считать все входные данные и затем только будет проводиться обработка. Вот пример типичного конвейера:

nroff -mm text| col| lpr

Здесь nroff - это форматер текста, имеющийся в Системе Обработки Текстов UNIX, col - преобразует вывод для конкретного типа дисплея и lpr осуществляет печать текста. Флаг '-mm' обозначает одну из наиболее часто употребляемых опций форматирования, и text - это имя файла, который должен быть отформатирован.
Следующие примеры демонстрируют множество возможностей, которые могут быть получены комбинированием команд описанными выше способами. Попробуйте выполнить их:

who

Печатает на экране список зарегистрированных в системе пользователей.

who >> log

Добавляет список загруженных пользователей в конец файла log.

who| wc -l

Печатает количество зарегистрированных пользователей.

who| pr

Постранично печатает список пользователей.

who| sort

Печатает список пользователей в алфавитном порядке.

who| grep bob

Печатает список пользователей, чьи имена содержат слово bob.

who| grep bob| sort| pr

Печатает постранично в алфавитном порядке список пользователей, чьи имена содержат слово bob.

{ date;who | wc -l; } >> log

Добавляет в файл log текущую дату и количество зарегистрированных в системе пользователей. Обратите внимание на пробелы после левой фигурной скобки и перед правой фигурной скобкой.

who| sed -e 's/.*//'| sort| uniq -d

Печатает имена только тех пользователей, которые регистрировались в системе более одного раза. Обратите внимание на использование sed в качестве фильтра для удаления символов, стоящих после имени пользователей.
Команда who сама по себе не имеет возможности получать все эти результаты - их можно получить только объединив who с другими командами. Команда who в этих примерах служит как источник информации. В качестве упражнения замените "who|" на "</etc/passwd" и убедитесь в том, что файл может также быть использован как источник данных. Помните, что аргументы переадресации могут находиться в любом месте в командной строке, даже в самом ее начале. Это значит, что конвейер

< infile >outfile sort| pr

аналогична

sort < infile |pr >outfile

7.Использование специальных символов в shell


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: