Конвейеры
Нередко возникает ситуация, когда нужно обработать вывод одной команды какой-нибудь другой командой. То есть перенаправляется вывод одной команды не в файл, а на вход другой команды. Такой способ передачи называется конвейером и обозначается символом |.
Например, нужно отсортировать оглавление каталога в алфавитном порядке, т.е. результат команды 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, которая работает с повторяющимися строками, подсчитать расположенные подряд повторяющиеся строки (ключ -с), т.е. типы файлов.
Задание:
- Используя команду wc -l (word count - подсчет слов, ключ -l (эль) позволяет подсчитать количество строк) и команду find, создайте конвейер, который позволит вам подсчитать количество файлов (строк, выдаваемых командой find) в каталоге /bin.
- В домашнем каталоге создайте файл list, который будет содержать список всех файлов, содержащихся в домашнем каталоге, в алфавитном порядке.
- В домашнем каталоге создайте файл commandlist, который будет содержать список файлов из каталогов /bin, /usr/bin в алфавитном порядке.
- Используя команду grep, которая используется для поиска строк (регулярных выражений) в файлах (см. help), найти все файлы, содержащие слово mkdir. Поиск организовать в домашнем каталоге. (Используйте ключ -l).