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

LXF97:Bash

Материал из Linuxformat
(Различия между версиями)
Перейти к: навигация, поиск
м
Строка 197: Строка 197:
 
Миссия завершена!
 
Миссия завершена!
  
==== Помощь по grep (вырезка) ====
+
==== Помощь по grep (врезка) ====
 
Поскольку  grep производит поиск соответствий по шаблонам, вы  
 
Поскольку  grep производит поиск соответствий по шаблонам, вы  
 
должны предоставить ему регулярное выражение для этого шаблона.  
 
должны предоставить ему регулярное выражение для этого шаблона.  
Строка 204: Строка 204:
 
*^abc Соответствует строкам, начинающимся с "abc".
 
*^abc Соответствует строкам, начинающимся с "abc".
  
==== Мини-проект: команды для умных (вырезка) ====
+
==== Мини-проект: команды для умных (врезка) ====
 
Есть несколько общих команд, о которых  
 
Есть несколько общих команд, о которых  
 
полезно знать. Привожу некоторые из них без  
 
полезно знать. Привожу некоторые из них без  

Версия 15:11, 9 марта 2008

Содержание

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.

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