Журнал LinuxFormat - перейти на главную

LXF97:Bash

Материал из Linuxformat
Перейти к: навигация, поиск
Bash. Рэйчел Проберт
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

Поскольку grep производит поиск соответствий по шаблонам, вы должны предоставить ему регулярное выражение для этого шаблона. Регулярные выражения бывают простыми и сложными. Наиболее распространенные (и простые) типы регулярных выражений выглядят так:

  • abc Соответствует строкам, которые содержат "abc" в любом месте.
  • ^abc Соответствует строкам, начинающимся с "abc".

Вот теперь повеселимся! 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: Стандартный ввод-вывод

Мини-проект: команды для умных

Есть несколько общих команд, о которых полезно знать. Привожу некоторые из них без объяснений; эти команды можно использовать независимо от дополнительных опций. Наберите их и посмотрите на результат.

date df
date +%D free
date +%T du
cal top
cal 1066 ps

Стандартный ввод/вывод позволяет вводить данные в программу из любого источника и выводить данные в любой источник. Таким образом, можно направить вывод одной команды непосредственно на ввод другой команды... правда, мило? 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

Миссия завершена!


Через месяц Moнтирование, создание резервных копий, распаковка файлов из tar и zip.

Персональные инструменты
купить
подписаться
Яндекс.Метрика