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
Помощь по grep (вырезка)
Поскольку grep производит поиск соответствий по шаблонам, вы должны предоставить ему регулярное выражение для этого шаблона. Регулярные выражения бывают простыми и сложными. Наиболее распространенные (и простые) типы регулярных выражений выглядят так:
- abc Соответствует строкам, которые содержат “abc” в любом месте.
- ^abc Соответствует строкам, начинающимся с “abc”.
Чтобы прочитать содержимое этих файлов, можно открыть их в текстовом редакторе 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
Миссия завершена!
Мини-проект: команды для умных
Есть несколько общих команд, о которых полезно знать. Привожу некоторые из них без объяснений; эти команды можно использовать независимо от дополнительных опций. Наберите их и посмотрите на результат. date df date +%D free date +%T du cal top cal 1066 ps
Через месяц Moнтирование, создание резервных копий, распаковка файлов из tar и zip.