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

LXF97:Bash

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

Текущая версия на 10:33, 17 ноября 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

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


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

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