Skip to main content

Конвейеры

Нередко возникает ситуация, когда нужно обработать вывод одной команды какой-нибудь другой командой. То есть перенаправляется вывод одной команды не в файл, а на вход другой команды. Такой способ передачи называется конвейером и обозначается символом |.

Например, нужно отсортировать оглавление каталога в алфавитном порядке, т.е. результат команды ls передать команде sort.

ls   |   sort

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

ls   /usr/bin   |   sort   |   less

С помощью конвейера можно объединять в цепочку много команд:

Команда1 | команда2 | ... | командаN

Рассмотрим более сложный пример. Напишем команды, которые позволят определить файлы какого типа, в каком количестве содержатся в домашнем каталоге пользователя.

find   ~   -type f   |   xargs   -n1   file   |   cut   -d:   -f2   |   sort   |   uniq   -c

Для этого сначала мы должны отделить файлы от каталогов, используя команду find с ключом -type f. Получим в результате список всех файлов, содержащихся в домашнем каталоге. У каждого файла, используя команду file, мы можем определить тип. Проблема в том, что команде file нужно построчно подавать значения из имеющегося у нас списка всех файлов. Здесь на помощь приходит команда xargs, которая считывает данные с выходного потока одной команды и передает их другой команде в качестве аргумента (ключ -n1 позволяет считывать и передавать данные построчно).

Команда file делает вывод данных в следующем формате:

имя_файла : тип

Например, listtext : ASCII text

Нам нужны только типы файлов, их имена нас не интересуют. Нужно вырезать данные второй колонки, для этого часто используется команда cut, ключ -d указывает символ, разделяющий колонки (в данном случае это двоеточие), ключ -f для указания какую по счету взять колонку.

Полученные данные (списки типов файлов) необходимо отсортировать командой sort и при помощи команды uniq, которая работает с повторяющимися строками, подсчитать расположенные подряд повторяющиеся строки (ключ -с), т.е. типы файлов.

Задание:

  1. Используя команду wc -l (word count - подсчет слов, ключ -l (эль) позволяет подсчитать количество строк) и команду find, создайте конвейер, который позволит вам подсчитать количество файлов (строк, выдаваемых командой find) в каталоге /bin.
  2. В домашнем каталоге создайте файл list, который будет содержать список всех файлов, содержащихся в домашнем каталоге, в алфавитном порядке.
  3. В домашнем каталоге создайте файл commandlist, который будет содержать список файлов из каталогов /bin, /usr/bin в алфавитном порядке.
  4. Используя команду grep, которая используется для поиска строк (регулярных выражений) в файлах (см. help), найти все файлы, содержащие слово mkdir. Поиск организовать в домашнем каталоге. (Используйте ключ -l).