LXF97:Bash
|
|
|
Содержание |
Bash: Используем командную строку
Часть 2 Хотите проводить в командной строке больше времени? Рэйчел Проберт расскажет о grep, pipe и других командах, которые обязательно надо знать.
В прошлый раз мы говорили о действиях, потенциально способных
отобрать много времени: например, необходимо быстро найти отчет,
написанный когда-то давно. Вы забыли имя файла, но помните, что
темой отчета было соглашение с компанией ABC. После обнаружения
документа его содержимое нужно отправить коллеге или шефу.
grep -r -i -H CompanyABC /home/rjprobert/work cat filename | mail colleague@work.com
Для начала мы разомнемся с помощью нескольких команд для
опытных пользователей. Они вряд ли пригодятся обычным пользователям для каждодневной работы, но если вы администратор системы
и устанавливаете программы для своих пользователей, значение этих
команд повышается.
Команда whoami не вовлечет вас в философские дискуссии по
самопознанию, но напомнит, под каким именем пользователя вы вошли в систему; очень удобно, когда вы работаете с несколькими учетными записями, используемыми для решения различных задач, и постоянно переключаетесь между ними. Похожая команда, whatis, позволит
понять, что делает та или иная программа. В Linux сотни программ, и
невозможно запомнить, что делает каждая из них. Например, напечатав whatis grep, вы увидите:
grep (1) - print lines matching a pattern
Команда whereis поможет найти другие нужные вам команды или
программы. Если вы загружаете из Интернета программу, для работы
которой нужна другая программа, вам захочется узнать, установлена
ли она в вашей системе. Чтобы выяснить местонахождение программы
и ее man-страницы, наберите whereis [имя программы]. Так, например,
находится расположение популярного текстового редактора vi:
whereis vi
Echo – небольшая команда, повторяющая все, что вы ни напечатали. Например, если набрать echo hello, на экране появится слово "hello". Вообще говоря, обычно это делать незачем: команда echo может пригодиться вам в будущем, если вы начнете писать скрипты. (Скрипт – это небольшая программа, позволяющая выполнить несколько команд за один раз.) В скриптах echo может использоваться для отображения действий скрипта в каждый момент времени, или чтобы попросить пользователя что-нибудь сделать, например, ввести текст. Команда last выведет список пользователей, заходивших сегодня в систему, и терминалы, которые они используют (использовали). Набрав exit, вы завершите сеанс работы с терминалом. Если нужно зайти в систему под другим пользователем, используйте вместо нее команду logout.
Часть 1: По Grep’у!
Вот теперь повеселимся! Grep – команда, которая находит слова в
файлах. Охотно сказала бы, что ее название произошло от слова
"поиск" по-клингонски, но это было бы неправдой и только укрепило бы стереотип, что все технари любят Star Trek! На самом деле
название команды – сокращение от "Глобальный Парсер Регулярных
Выражений" (Global Regular Expression Parser), что означает "глобальный поиск строк, соответствующих регулярному выражению, и их
вывод на экран". Название команды происходит от команды текстового
редактора ed g/re/p, выполняющей подобные действия.
Начнем с создания специального каталога, где будем размещать новые
файлы. Чтобы убедиться, что каталог создан, используйте команду ls.
probert@ubuntu:~$ mkdir Work probert@ubuntu:~$ ls Bin Desktop Examples LAN Music Work
Откроем текстовый редактор и создадим новый файл report1.txt:
probert@ubuntu:~$ pico report1.txt
Pico – это текстовый редактор, который я использовала при написании
этой статьи. В дистрибутив Linux включено несколько текстовых редакторов; выбор одного из них определяется лишь вашими предпочтениями и наличием у редактора специальных функций, которые помогут
в решении именно вашей задачи. Когда текстовый редактор откроется,
напечатайте слово CompanyABC. Затем точно так же создайте второй
файл с именем report2.txt, который будет содержать слово companyabc.
Закончив, введите команду ls, и вы увидите примерно такой список:
probert@ubuntu:~$ ls Bin Desktop Examples LAN Music report1.txt report2.txt Work
Обратите внимание, что файлы, которые мы создали, находятся рядом
с каталогом Work. Давайте переместим их в нужный каталог:
probert@ubuntu:~$ mv report*.txt /home/probert/Work probert@ubuntu:~$ ls Bin Desktop Examples LAN Music Work
Звездочка (*) – это специальный символ, который позволяет нам
делать все, что мы хотим, с файлами, название которых начинается со
слова report; каждый из таких файлов включается в команду. У меня
есть правила именования файлов и разделения их на категории, которых я строго придерживаюсь. Например, названия всех файлов отчетов
начинаются со слова report, счетов – со слова invoice и т.д. Пускай это
выглядит как ритуальные действия безнадежно больного ОКР, зато при
наличии методичного подхода нужные вещи находятся очень быстро!
Переместимся в каталог Work и снова используем ls, чтобы убедиться,
что все файлы перемещены:
probert@ubuntu:~$ cd Work probert@ubuntu:~/Work$ ls report1.txt report2.txt
Сейчас мы сделаем следующий шаг в поисках этого крайне важного
файла для нашего коллеги. Команда grep обладает множеством опций
(их список выведет команда man grep). Опция -r позволяет выполнить
рекурсивный поиск файлов, начиная с названного каталога, а опция -i
выполнит поиск без учета регистра. Попробуйте следующие команды с
опцией -i и без -i и посмотрите, как это повлияет на результаты поиска.
probert@ubuntu:~/Work$ grep -r -i ‘CompanyABC’ /home/ probert/Work
Результат будет примерно таким:
/home/probert/Work/report1.txt:CompanyABC /home/probert/Work/report2.txt:companyabc
Итак, мы нашли этот неуловимый файл; что же дальше?
Часть 2: Стандартный ввод-вывод
Стандартный ввод/вывод позволяет вводить данные в программу из
любого источника и выводить данные в любой источник. Таким образом, можно направить вывод одной команды непосредственно на ввод
другой команды... правда, мило? Linux предоставляет три канала ввода/вывода, более известных как потоки ввода/вывода. По умолчанию стандартный ввод подразумевает клавиатуру, стандартный вывод – экран.
Третий поток ввода/вывода – это на самом деле поток вывода для сообщений об ошибках, предупреждений и оповещений: так легче отличить
сообщения об ошибках от остальных сообщений. Поток ошибок обычно
также выводится на экран, но (как и каждый из трех стандартных потоков) может быть перенаправлен. Этим мы сейчас и займемся.
Есть два основных способа перенаправления потоков данных; мы
можем использовать > или | (перенаправление и каналы соответственно). Если нужно просто направить стандартный вывод в файл, можно
напечатать команда > файл. Давайте попробуем это на реальном примере: найдем все файлы с именем passwd в каталоге /etc. Наберите
find /etc -name passwd
Результат будет примерно таким (он зависит от особенностей вашего
дистрибутива Linux):
probert@ubuntu:~$ find /etc -name passwd find: /etc/ssl/private: Permission denied /etc/passwd /etc/pam.d/passwd find: /etc/cups/ssl: Permission denied
Обратите внимание, что команда генерирует как стандартный поток
вывода, так и поток ошибок. Сейчас мы создадим файл findresult и
перенаправим стандартный поток вывода в этот файл, оставив на экране только ошибки.
probert@ubuntu:~$ find /etc -name passwd > findresult find: /etc/ssl/private: Permission denied find: /etc/cups/ssl: Permission denied
Перенаправим эти ошибки в другой файл, finderrors, используя 2>.
probert@ubuntu:~$ find /etc -name passwd 2> finderrors /etc/passwd /etc/pam.d/passwd
Наберите ls, и вы получите результат, похожий на мой.
probert@ubuntu:~$ ls Bin Desktop Examples finderrors findresult LAN Music
Чтобы прочитать содержимое этих файлов, можно открыть их в текстовом редакторе pico:
probert@ubuntu:~$ pico findresult
Я предпочитаю просматривать небольшие файлы с помощью команды
cat. Ниже я использовала эту команду для просмотра результатов поиска в файлах findresult и finderrors.
probert@ubuntu:~$ cat findresult /etc/passwd /etc/pam.d/passwd probert@ubuntu:~$ cat finderrors find: /etc/ssl/private: Permission denied find: /etc/cups/ssl: Permission denied
Вы также можете добавить информацию в файл с помощью команды
>>. Давайте перенаправим стандартный вывод, чтобы добавить информацию в наш первый файл findresult следующим образом:
probert@ubuntu:~$ find /etc -name passwd 2>> findresult
Вы можете снова проверить результаты с помощью команды cat
findresult. Второй способ перенаправления потоков – вывод одной
команды прямо на вход другой (канализация). Давайте проверим
содержимое каталога /usr/lib, где находятся объектные файлы, библиотеки и системные двоичные файлы. В моем каталоге /usr/lib примерно полторы тысячи файлов – многовато, чтобы прокручивать этот
список один за другим! Если мы перенаправим вывод ls на ввод команды less, то получим список, в котором можно перемещаться по страницам, в удобном для нас темпе. Попробуйте:
ls /usr/lib | less
Достигнув конца документа, нажмите клавишу Q, чтобы вернуться в
командную строку. Вы также можете предварительно отсортировать
этот список по убыванию, например, таким образом:
ls /usr/lib | sort -r | less
Краеугольный камень философии Unix заключается в том, чтобы каждая программа делала что-то одно по-настоящему хорошо, позволяя
использовать свой вывод как ввод другой программы. Использование
каналов позволяет провести этот принцип в жизнь, создавая очень
эффективные цепочки команд.
Теперь, разузнав, как работают grep и каналы, сведем их вместе для
поиска того самого отчета и отправим его нашему коллеге:
grep -r -i -H CompanyABC /home/rjprobert/work cat report1.txt | mail colleague@work.com
Миссия завершена!
Помощь по grep (врезка)
Поскольку grep производит поиск соответствий по шаблонам, вы должны предоставить ему регулярное выражение для этого шаблона. Регулярные выражения бывают простыми и сложными. Наиболее распространенные (и простые) типы регулярных выражений выглядят так:
- abc Соответствует строкам, которые содержат "abc" в любом месте.
- ^abc Соответствует строкам, начинающимся с "abc".
Мини-проект: команды для умных (врезка)
Есть несколько общих команд, о которых полезно знать. Привожу некоторые из них без объяснений; эти команды можно использовать независимо от дополнительных опций. Наберите их и посмотрите на результат.
date | df |
date +%D | free |
date +%T | du |
cal | top |
cal 1066 | ps |
Через месяц Moнтирование, создание резервных копий, распаковка файлов из tar и zip.