$ df | awk '{print $1}' | grep -v "Filesystem"
/dev/hda5 /dev/hda8 /dev/hda6 /dev/hdb5 /dev/hdb1 /dev/hda7 /dev/hda1
С помощью редактора sed можно удалить из полученного списка повторяющуюся подстроку /dev/, оставив только имя раздела. Вот как это делается:
$ df | awk '(print $1}' | grep -v "Filesystem" | sed s'/\/dev\///g'
hda5 hdа8 hda6 hdb6 hdb1 hda7 hda1
Команда s редактора sed предназначена для замены указанного шаблона (в данном случае \/dev\/; символы '/' имеют специальное назначение, поэтому защищены символами \) заданной строкой (в нашем случае это пустая строка). Флаг g означает, что замену нужно производить каждый раз, когда обнаружено совпадение, а не только первый раз.
В следующем примере команда sort сортирует строки текстового файла myfile, а результат посылается на принтер:
$ sort myfile | lp
5.5. Команда tee
Команда tee функционирует следующим образом: входные данные копируются, при этом одна копия направляется в стандартный поток вывода, а другие копии — в указанные файлы. Общий формат этой команды таков:
tee [-a] файлы
Опция -a задает добавление выводимых данных в конец файла (по умолчанию производится замена содержимого файла). Команду tee удобно применять в том случае, когда необходимо вести журнал выводимых данных или сообщений.
Рассмотрим пример. Команда who формирует список пользователей, которые зарегистрированы в данный момент в системе, а команда tee отображает этот список на экране, направляя копию в файл who.out.
$ who | tee who.out
louise pts/l May 20 12:58 (193.132.90.9)
matthew pts/0 May 20 10:18 (193.132.90.1)
$ cat who.out
louise pts/1 May 20 12:58 (193.132.90.9) matthew pts/0 May 20 10:18 (193.132.90.1)
В следующем примере команда cpio выполняет резервирование файлов из каталога /home на магнитную ленту, а список помещаемых в архив файлов фиксируется в файле tape.log. Поскольку с помощью команды cpio производится последовательное добавление данных в архив, воспользуйтесь опцией '-a' команды tee:
$ find /home -depth -print | cpio -ov -0 /dev/rmt0 | tee -a tape.log
Чтобы сообщить пользователю о том, кто именно выполнил сценарий myscript, сохраняющий выводимые данные в файле myscript.log, можно перед вызовом сценарии задать несложную команду echo:
$ echo "Сценарий myscript запушен пользователем dave" | tee -a myscript.log $ myscript | tee -a myscript.log
Можно направлять вывод нескольких команд в один и тот же файл, но не забывайте применять опцию '-a'.
$ sort myfile | tee -a accounts.log $ myscript | tee -a accounts.log
5.6. Стандартные потоки ввода, вывода и ошибок
С каждым процессом (командой, сценарием и т. п.), выполняемым в интерпретаторе shell, связан ряд открытых файлов, из которых процесс может читать свои данные, и в которые он может записывать их. Каждый из этих файлов идентифицируется числом, называемым дескриптором файла, но у первых трех файлов есть также именам которые легче запоминать:
Файл
Дескриптор
Стандартный поток ввода (stdin)
0
Стандартный поток вывода (stdout) Стандартный поток ошибок (stderr)
1
2
В действительности создается 12 открытых файлов, но, как видно из таблицы, файлы с дескрипторами 0,1 и 2 резервируются для стандартных потоков ввода, вывода и ошибок. Пользователи могут также работать с файлами, имеющими дескрипторы от 3 до 9.
5.6.1. Стандартный поток ввода
Файл стандартного потока ввода (stdin) имеет дескриптор 0. Из этого файла процессы извлекают свои входные данные. По умолчанию входной поток ассоциирован с клавиатурой (устройство /dev/tty), но чаще всего он поступает по каналу от других процессов или из обычного файла.
5.6.2. Стандартный поток вывода
Файл стандартного потока вывода (stdout) имеет дескриптор 1. В этот файл записываются все выходные данные процесса. По умолчанию данные выводятся на экран терминала (устройство /dev/tty), но их можно также перенаправить в файл или послать по каналу другому процессу.
5.6.3. Стандартный поток ошибок
Файл стандартного потока ошибок (stderr) имеет дескриптор 2. В этот файл записываются сообщения об ошибках, возникающих в ходе выполнения команды. По умолчанию сообщения об ошибках выводятся на экран терминала (устройство /dev/tty), но их также можно перенаправить в файл. Зачем же для регистрации ошибок выделять специальный файл? Дело в том, что это очень удобный способ выделения из результатов работы команды собственно выходных данных, а также хорошая возможность эффективно организовать ведение различного рода журнальных файлов.
5.7. Файловый ввод–вывод
При вызове команд можно указывать, откуда следует принимать входные данные и куда необходимо направлять выходные данные, а также сообщения об ошибках. По умолчанию, если не указано иное, подразумевается работа с терминалом: данные вводятся с клавиатуры и выводятся на экран. Но интерпретатор shell располагает механизмом переадресации, позволяющим ассоциировать стандартные потоки с различными файлами. В табл. 5.1 приведены наиболее распространенные операторы переадресации.
Во время перенаправления стандартного потока ошибок следует указывать дескриптор файла (2). Для потоков ввода и вывода делать это не обязательно.
Таблица 5.1. Основные операторы переадресации
команда > файл
Направляет стандартный поток вывода в новый файл
команда 1> файл
Направляет стандартный поток вывода в указанный файл
команда >> файл
Направляет стандартный поток вывода в указанный файл (режим присоединения)
команда > файл 2>&1
Направляет стандартные потоки вывода и ошибок в указанный файл
команда 2> файл
Направляет стандартный поток ошибок в указанный файл
команда 2» файл
Направляет стандартный поток ошибок в указанный файл (режим присоединения)
команда >> файл 2>&1
Направляет стандартные потоки вывода и ошибок в указанный файл (режим присоединения)
команда < файл1 > файл2
Получает входные данные из первого файла и направляет выходные данные во второй файл
команда < файл
В качестве стандартного входного потока получает данные из указанного файла
команда << разделитель
Получает данные из стандартного потока ввода до тех пор, пока не встретится разделитель
команда <&m
В качестве стандартного входного потока получает данные из файла с дескриптором m
команда > &m
Направляет стандартный поток вывода в файл с дескриптором m
5.7.1. Переадресация стандартного потока вывода
Рассмотрим, как осуществляется переадресация стандартного потока вывода. В следующей командной строке из файла /etc/passwd извлекаются имена пользователей, известных в системе, полученный список сортируется по алфавиту, а результаты направляются в файл sort.out.