консоль — Заметки о жизни в консоли.
По заказу рассказываю о маленьких радостях жизни без иксов.
Было время, когда большинство программ, которые я использовал были именно консольные. Это centericq(ныне centerim), mcabber и irssi для общения; orpheus для прослушивания музыки; pine для работы с почтой и ещё целая куча всего(уже не вспомню) для совершенно разных задач.
Сейчас, конечно, я нашёл для себя удобный GUI'шный софт, но многие задачи без консоли сделать всё-таки неудобно. Вот, некоторые из них(при прочтении рекомендую прикидывать, сколько времени и действий займёт каждый из примеров при выполнении их в GUI).
Работа с файлами.
Перемещение, копирование файлов.
Когда я настраивал систему печати с необычным принтером, надо было стянуть много разных фильтров foomatic. В итоге в директории, в которую я всё загружал собралось много архивов tar.gz(около сотни). Надо их всех разархивировать в этой же директории, а сами архивы переместить куда-нибудь, чтобы не мешались.
Командой find я нашёл вс файлы в этой директории и отдал их на рстерзание архиватору, после чего кдалил все архивы, а всё, что получилось сжал в один большой архив и положил его в /backups/
Вообще, для работы с большим количеством файлов рекомендую учить regexp'ы. С их помощью можно творить чудеса.
Копирование и права доступа.
На одном из моих компьютеров заведено две учётные записи. Для меня и для жены. Но есть файлы, доступ к которым нужен нам обоим. Та же музыка. И вот, появилось у меня несколько сотен песен какой-нибудь группы, и надо этим всем поделиться. Моя музыка лежит в /home/cppmm/music/%groupname%
В домашней директории жены я создаю симлинк на нужную директорию, а на саму директорию и все файлы в ней ставлю права, с которыми любой пользователь, состоящий в группе users, может спокойно работать:
Изменение файлов.
Был такой случай. Надо было в движке сайта во всех php-файлах сменить одну функцию на другую.
Тут я лично менял perl'ом, никто не мешает использовать для этого sed или awk, или ещё что-нибудь.
Поиск и работа с информацией в файлах.
Иногда надо что-то найти в файле. Какую-то запись, или какую-то строку. Я покажу возможности консольных утилит на примере работы с логами.
Возьмём для примера лог икс-сервера. Сделаем так:
Мы прочитали первые 13 строк лога, но на консоль вывели только последние три из низ. Проще говоря, мы увидели 11-ую, 12-ую и 13-ую строки. Но интересно нам другое. В этих строках указываются ключи, которые ставятся перед каждой записью в логе и их пояснение.
Попробуем прочитать все предупреждения(warning), полученные при старте иксов.
У меня, к сожалению, варнингов нет, потому что я уже таким образом ранее grep'ал и исправил все ошибки. :)
Попробуем тогда информационные сообщения. Если просто grep'нуть по II, выводит очень много. Надо как-то ограничить вывод. Как вариант выведем только интересные(а не общие) сообщения, касающиеся драйвера видеокарты.
Сначала я получил всё, что связано с II, потом из этого вывода всё, что связано с NVIDIA, а потом отсеял неинтересующие меня сообщения с NVIDIA(0).
И вот мне стало интересно, что же подробнее написано в следующих строках после вот этой:(II) NVIDIA GLX Module 173.14.18 Mon Mar 2 12:43:12 PST 2009
Теперь я знаю, что это 93-я строка. А дальше дело техники - читаем первые 103 строчки, но выводим только последние 10 из них. Но с одним ньансом. Эти 10 строк мы не выводим на экран, а сохраняем в отдельный файл, чтобы, к примеру, потом его проанализировать.
Теперь, можно посмотреть этот файл.
А можно добавить в него пометку:
После этого мы получим в конце файла строку "25.07.09 Интересный кусок лога", где вместо 25.07.09 будет сегодняшняя дата.
Ну и напоследок небольшой пример, который вряд ли понадобится обычному пользователю, но очень показателен в плане принципов работы в консоли вообще. Есть такая утилита - tcpdump. Это сниффер траффика. Так вот работа с этой утилитой - это основной принцип консоли, а именно - разговор.
Возьмём запрос:
Этой командой я сказал показать все пакеты проходящие на интерфейсе eth0 для адресов 192.168.1.1 или 192.168.1.2, кроме 22-го и 80-го портов и пингов.
Как видите, по сути я просто напечатал предложение на английском языке. В этом и есть вся консоль - это разговор с компьютером. Я ему ставлю условия, говорю, что делать, а он мне отвечает.
Конечно, в такой статье всех радостей консоли не описать. Тысячи их. :)
И, конечно, для работы с ней надо знать язык консоли. Надо уметь с ней разговаривать. Для этого придётся потратить немного времени на чтение манов и изучение различных хитростей и особенностей. Но не забывайте, что время, потраченное на такое обучение в будущем сэкономит сотни часов по сравнению с мышковозюканьем и кнопочкотыканьем.
В этом описании я показал только несколько приёмов. Но намеренно обошёл стороной одну неотъемлемую часть работы в консоли - написание скриптов. По сути своей shell-скрипты - это те же самые команды, только записанные в файл(с некоторыми особенностями). Освоив работу в консоли и создание самых простеньких скриптов, времени тратится ещё меньше. Пример я уже выкладывал тут. Полчаса потраченные на написание скрипта окупаются слихвой при работе с ним.
И главное - не пугаться этих команд и больших конструкций. Всё это всего лишь небольшие утилитки, работающие в связке. И даже зачастую не приходится писать их вручную и запоминать сотни параметров. Всегда есть bash-completion и подсказки вида %commandname% --help.
Удачи!
Было время, когда большинство программ, которые я использовал были именно консольные. Это centericq(ныне centerim), mcabber и irssi для общения; orpheus для прослушивания музыки; pine для работы с почтой и ещё целая куча всего(уже не вспомню) для совершенно разных задач.
Сейчас, конечно, я нашёл для себя удобный GUI'шный софт, но многие задачи без консоли сделать всё-таки неудобно. Вот, некоторые из них(при прочтении рекомендую прикидывать, сколько времени и действий займёт каждый из примеров при выполнении их в GUI).
Работа с файлами.
Перемещение, копирование файлов.
Когда я настраивал систему печати с необычным принтером, надо было стянуть много разных фильтров foomatic. В итоге в директории, в которую я всё загружал собралось много архивов tar.gz(около сотни). Надо их всех разархивировать в этой же директории, а сами архивы переместить куда-нибудь, чтобы не мешались.
find ./ -type f -exec tar -xzvf '{}' \; && rm -f ./*.tar.gz && tar -xjvf /backups/foomatic_filters.tar.bz2 ./
Командой find я нашёл вс файлы в этой директории и отдал их на рстерзание архиватору, после чего кдалил все архивы, а всё, что получилось сжал в один большой архив и положил его в /backups/
Вообще, для работы с большим количеством файлов рекомендую учить regexp'ы. С их помощью можно творить чудеса.
Копирование и права доступа.
На одном из моих компьютеров заведено две учётные записи. Для меня и для жены. Но есть файлы, доступ к которым нужен нам обоим. Та же музыка. И вот, появилось у меня несколько сотен песен какой-нибудь группы, и надо этим всем поделиться. Моя музыка лежит в /home/cppmm/music/%groupname%
В домашней директории жены я создаю симлинк на нужную директорию, а на саму директорию и все файлы в ней ставлю права, с которыми любой пользователь, состоящий в группе users, может спокойно работать:
ln -s /home/cppmm/music/%groupname%/ /home/username/%groupname% && chown -Rv cppmm:users /home/cppmm/music/%groupname% && chmod -R ug+rw /home/cppmm/music/%groupname%
Изменение файлов.
Был такой случай. Надо было в движке сайта во всех php-файлах сменить одну функцию на другую.
find ./ -name *.php | xargs perl -pi -e 's/oneword/anotherword/g'
Тут я лично менял perl'ом, никто не мешает использовать для этого sed или awk, или ещё что-нибудь.
Поиск и работа с информацией в файлах.
Иногда надо что-то найти в файле. Какую-то запись, или какую-то строку. Я покажу возможности консольных утилит на примере работы с логами.
Возьмём для примера лог икс-сервера. Сделаем так:
1 2 3 4 |
$ head -n 13 Xorg.0.log | tail -n 3 Markers: (--) probed, (**) from config file, (==) default setting, (++) from command line, (!!) notice, (II) informational, (WW) warning, (EE) error, (NI) not implemented, (??) unknown. |
Мы прочитали первые 13 строк лога, но на консоль вывели только последние три из низ. Проще говоря, мы увидели 11-ую, 12-ую и 13-ую строки. Но интересно нам другое. В этих строках указываются ключи, которые ставятся перед каждой записью в логе и их пояснение.
Попробуем прочитать все предупреждения(warning), полученные при старте иксов.
1 2 3 |
$ grep WW Xorg.0.log (WW) warning, (EE) error, (NI) not implemented, (??) unknown. |
У меня, к сожалению, варнингов нет, потому что я уже таким образом ранее grep'ал и исправил все ошибки. :)
Попробуем тогда информационные сообщения. Если просто grep'нуть по II, выводит очень много. Надо как-то ограничить вывод. Как вариант выведем только интересные(а не общие) сообщения, касающиеся драйвера видеокарты.
1 2 3 4 5 6 |
$ grep II Xorg.0.log | grep NVIDIA | grep -v NVIDIA\(0\) (II) Module glx: vendor="NVIDIA Corporation" (II) NVIDIA GLX Module 173.14.18 Mon Mar 2 12:43:12 PST 2009 (II) Module nvidia: vendor="NVIDIA Corporation" (II) NVIDIA dlloader X Driver 173.14.18 Mon Mar 2 12:22:46 PST 2009 (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs |
Сначала я получил всё, что связано с II, потом из этого вывода всё, что связано с NVIDIA, а потом отсеял неинтересующие меня сообщения с NVIDIA(0).
И вот мне стало интересно, что же подробнее написано в следующих строках после вот этой:(II) NVIDIA GLX Module 173.14.18 Mon Mar 2 12:43:12 PST 2009
1 2 |
$ cat -n Xorg.0.log | grep GLX\ Module 93 (II) NVIDIA GLX Module 173.14.18 Mon Mar 2 12:43:12 PST 2009 |
Теперь я знаю, что это 93-я строка. А дальше дело техники - читаем первые 103 строчки, но выводим только последние 10 из них. Но с одним ньансом. Эти 10 строк мы не выводим на экран, а сохраняем в отдельный файл, чтобы, к примеру, потом его проанализировать.
$ head -n 103 Xorg.0.log | tail -n 10 > glx.log
Теперь, можно посмотреть этот файл.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cat glx.log (II) Loading extension GLX (II) LoadModule: "dbe" (II) Loading /usr/lib/xorg/modules/extensions//libdbe.so (II) Module dbe: vendor="X.Org Foundation" compiled for 1.5.3, module version = 1.0.0 Module class: X.Org Server Extension ABI class: X.Org Server Extension, version 1.1 (II) Loading extension DOUBLE-BUFFER (II) LoadModule: "record" |
А можно добавить в него пометку:
$ echo "`date +%d.%m.%y` Интересный кусок лога" >> glx.log
После этого мы получим в конце файла строку "25.07.09 Интересный кусок лога", где вместо 25.07.09 будет сегодняшняя дата.
Ну и напоследок небольшой пример, который вряд ли понадобится обычному пользователю, но очень показателен в плане принципов работы в консоли вообще. Есть такая утилита - tcpdump. Это сниффер траффика. Так вот работа с этой утилитой - это основной принцип консоли, а именно - разговор.
Возьмём запрос:
$ tcpdump -ntpi eth0 host 192.168.1.1 or host 192.168.1.2 and not tcp port 22 and not tcp port 80 and not icmp
Этой командой я сказал показать все пакеты проходящие на интерфейсе eth0 для адресов 192.168.1.1 или 192.168.1.2, кроме 22-го и 80-го портов и пингов.
Как видите, по сути я просто напечатал предложение на английском языке. В этом и есть вся консоль - это разговор с компьютером. Я ему ставлю условия, говорю, что делать, а он мне отвечает.
Конечно, в такой статье всех радостей консоли не описать. Тысячи их. :)
И, конечно, для работы с ней надо знать язык консоли. Надо уметь с ней разговаривать. Для этого придётся потратить немного времени на чтение манов и изучение различных хитростей и особенностей. Но не забывайте, что время, потраченное на такое обучение в будущем сэкономит сотни часов по сравнению с мышковозюканьем и кнопочкотыканьем.
В этом описании я показал только несколько приёмов. Но намеренно обошёл стороной одну неотъемлемую часть работы в консоли - написание скриптов. По сути своей shell-скрипты - это те же самые команды, только записанные в файл(с некоторыми особенностями). Освоив работу в консоли и создание самых простеньких скриптов, времени тратится ещё меньше. Пример я уже выкладывал тут. Полчаса потраченные на написание скрипта окупаются слихвой при работе с ним.
И главное - не пугаться этих команд и больших конструкций. Всё это всего лишь небольшие утилитки, работающие в связке. И даже зачастую не приходится писать их вручную и запоминать сотни параметров. Всегда есть bash-completion и подсказки вида %commandname% --help.
Удачи!