Мы уже показали, как использовать
команду sort в качестве фильтра. Но эти примеры предполагали, что вы откуда-то
получили данные в файл, или ввели данные с клавиатуры своими собственными руками.
А что, если данные, которые вы хотите отсортировать, являются выходными данными
другой программы, например, такой как ls
? Если вы используете при
сортировке опцию -r
, данные будут расположены в порядке, обратном
лексикографическому. Если вы хотите получить перечень файлов вашего каталога
в обратном порядке, один из способов сделать это будет:
/home/larry/papers# ls
english-list
history-final
masters-thesis
notes
/home/larry/papers# ls > file-list
/home/larry/papers# sort -r file-list
notes
masters-thesis
history-final
english-list
/home/larry/papers#
Здесь мы сохранили результат
работы команды ls
в файле, а затем выполнили sort -r
над этим файлом. Но это очень коряво выглядит и требует создания временного
файла для хранения результата работы ls
.
Выход из положения дает
трубопровод (pipeline) (прим. переводчика: в нашей литературе принят
термин "конвейер", так далее и будем переводить "pipeline"). Конвейер
- это еще одно замечательное свойство shell, которое позволяет связывать последовательность
команд в конвейер, где stdout первой команды посылается прямо на stdin второй
команды и так далее. Здесь мы хотим послать stdout команды ls
на
stdin команды sort. Символ ``|'' олицетворяет конвейер:
/home/larry/papers# ls | sort -r
notes
masters-thesis
history-final
english-list
/home/larry/papers#
Эта команда намного короче и, очевидно, проще набирается. Другой полезный пример. Команда
/home/larry/papers# ls /usr/bin
выдает на дисплей длинный список имен файлов, большинство из которых слишком быстро промелькнет на экране, чтобы вы успели прочитать их. Давайте подключим к просмотру перечня имен файлов каталога /usr/bin команду more.
/home/larry/papers# ls /usr/bin | more
Теперь вы можете постранично листать файл в свое удовольствие.
Но чудеса на этом не кончаются! Мы можем связать в конвейер более, чем две команды. Команда head представляет из себя фильтр, который отображает первые строки входного потока (здесь, пришедшего по конвейеру). Если мы хотим отобразить последнее имя текущего каталога, упорядоченного по алфавиту, мы можем написать:
/home/larry/papers# ls | sort -r | head -1
notes
/home/larry/papers#
где head -1
просто выдает первую строку получаемого входного потока (в данном случае это
отсортированный в обратном порядке перечень имен файлов текущего каталога, выданных
командой ls
).