Вот из ит? man, apropos, whatis
В данном параграфе рассмотрим те способы, с помощью которых можно получить информацию по интересующему нас вопросу.
Для наглядности я поставлю перед собой вопрос, и попытаюсь показать как можно на него ответить, используя рассматриваемые команды. Иногда для того чтобы более широко раскрыть тему, и продемонстрировать парочку дополнительных приемов, я сознательно не буду замечать решения, которое лежит на поверхности:
Итак, как говорил Ворошилов, вопрос господа: Что же такое регулярные выражения и с чем их едят? - вопрос отнюдь не праздный и очень важный, поэтому попытаемся найти всю или почти всю информацию касающуюся данной темы. На иностранном языке эти самые выражения называются regular expression, возьмем для зацепки первое слово, regular - это и будет наша отправная точка.
Для начала попробуем узнать что поэтому поводу говорит man:
$ man regular No manual entry for regular
Увы, факир был пьян и так далее. Чем плох man без параметров, он слишком прямолинеен, и выведет вам страницу руководства, только в случае полного соответствия команды в запросе и команды в заголовке страницы. Но у man, есть полезный ключ -k, или символическая ссылка под именем apropos, с помощью которой ищется вхождение заданного в качестве параметра слова в заголовок страницы руководства. Итак набираем:
$ apropos regular Tcl_RegExpCompile (3) - Pattern matching with regular expressions Tcl_RegExpCompile [RegExp] (3) - Pattern matching with regular expressions
........... skipped .........
zgrep (1) - search possibly compressed files for a regular expression re (3) - Perl pragma to alter regular expression behaviour
Получаем изрядную порцию информации, в которой большая часть описывает, функции некого Tcl, который нам сейчас ни к селу ни к городу, поэтому попробуем отсеять из вывода apropos-а, ненужную информацию, делается это так:
$ apropos regular | grep -v Tcl_ pbmmask (1) - create a mask bitmap from a regular bitmap perlre (1) - Perl regular expressions regex (7) - POSIX 1003.2 regular expressions regexp (n) - Match a regular expression against a string regsub (n) - Perform substitutions based on regular expression pattern matching zgrep (1) - search possibly compressed files for a regular expression re (3) - Perl pragma to alter regular expression behaviour
Вот это называется, то что доктор прописал, получили меньше десятка страниц руководства которые относятся к интересующим нас выражениям. Сразу отбрасываем страницы относящиеся к битмапам и к перлу, в результате остается выжимка информация которая с большой вероятностью именно то что нужно. По идее более всего нам подходит третья строка regex из 7-го раздела.
Раздел это то, чего указано в скобках, для одного и того-же ключевого слова может найтись несколько страниц в разных разделах руководства, поэтому во всех доках и большинстве книжек по UNIX-ам при ссылке на руководство, указывается и раздел в котором содержится информация. Хотя в большинстве случаев нужная команда имеется в единственном экземпляре, и раздел указывать не обязательно. Но не в нашем случае, набрав man regex, к удивлению мы попадаем в третий раздел, где описаны Си-шные функции для работы с выражениями, но мы пока новички, и Си нам даром не нужен. Поэтому на всякий случай посмотрим раздел SEE ALSO, и там опять таки видим ссылку на 7-й раздел руководства с командой regex(7). Для того чтобы явно указать Мане к какой странице руководства обращаться, нужно набрать man 7 regex, вот теперь мы попадем именно на ту страницу, которая нам была и нужна. Есть еще один способ для просмотра всех страниц связанных с заданной командой, эта возможность включается с помощью ключа -a, так набрав man -a regex, сначала мы увидим страницу из третьего раздела, убедившись что она нам не подходит, мы выходим из less по q, нам сразу показывается следующая найденная страница, в нашем случае из 7-го раздела. Довольно таки удобно.
Еще до купы несколько полезных ключей:
$ whatis 7 regex regex (7) - POSIX 1003.2 regular expressions
так сказать краткая информация о команде;
$ time man sfgfg Command exited with non-zero status 1 27.07user 19.10system 0:55.31elapsed 83%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (1418055major+438160minor)pagefaults 0swaps
Сознательно была введена несуществующая команда, чтоб Маня помучилась и перевернула всю базу. Есть способ сократить поиск, ограничив с помощью ключа -S, разделы в которых производить поиск;
Есть еще один способ вывести man-овскую страницу на принтер, при условии что он из серии HP LJ4L или старшие модели LJ. В /etc/man.config вносятся изменения, после которых мы видим следующее:
$ cat /etc/man.config | grep TROFF #TROFF /usr/bin/groff -Tps -mandoc -P-g TROFF /usr/bin/groff -Tlj4 -mandoc -P-g #TROFF /usr/bin/groff -Thtml -mandoc -P-g
Первая из выведенных строк - старый вариант, формирующий пост-скрипт, а вторая, после моих изменений, и формирующая вывод понятный LaserJet-у. Также есть драйвер для groff, формирующий на выходе html, для этого нужно раскоментарить третью строку, а вторую закоментарить.
За точность не ручаюсь, т.к. принтера под рукой нету, и проверить не могу, но когдато такой вариант катил;
$ man -w regex /usr/man/man3/regex.3.gz $ man -wa regex /usr/man/man3/regex.3.gz /usr/man/man7/regex.7.gz
Здесь в первом случае печатается только первый найденный файл, а во втором все найденные файлы по данному ключевому слову.
Еще одна интересная комбинация ключа -w с ключем -K, в этом случае выводятся только имена файлов содержащих вхождение искомой подстроки:
$ man -wK httpd /usr/local/man/man1/wml_p3_eperl.1 /usr/man/man8/logrotate.8.gz /usr/man/man8/suexec.8.gz /usr/man/man8/rotatelogs.8.gz /usr/man/man8/logresolve.8.gz /usr/man/man8/httpd.8.gz /usr/man/man8/ab.8.gz /usr/man/man1/man2html.1.gz /usr/man/man1/perlfaq3.1.gz /usr/man/man1/htpasswd.1.gz /usr/man/man1/htdigest.1.gz /usr/man/man1/dbmmanage.1.gz /usr/lib/perl5/man/man3/CGI::Fast.3.gz /usr/lib/perl5/man/man3/CGI.3.gz
Здесь выводятся все страницы руководства в которых упоминается httdp, недостатки подхода - медленность и мало информативность, о содержимом файла приходится догадываться только по его названию. Как вывести с помощью ключей заголовок файла я не нашел, поэтому сделал простую команду, которая эквивалентна предыдущей, но вместо имени файла, выводит имя команды и заголовок страницы руководства, что может значительно облегчить поиск нужной страницы:
$ man -wK httpd | sed 's?.\+/\([^.]\+\)\.\([0-9]\+\).*$?\2 -f \1?' | xargs man logrotate (8)- rotates, compresses, and mails system logs suexec (8)- Switch User For Exec rotatelogs (8)- rotate Apache logs without having to kill the server logresolve (8)- resolve hostnames for IP-adresses in Apache logfiles httpd (8)- Apache hypertext transfer protocol server ab (8)- Apache HTTP server benchmarking tool man2html (1)- format a manual page in html perlfaq3 (1)- Programming Tools htpasswd (1)- Create and update user authentication files htdigest (1)- Create and update user authentication files dbmmanage (1)- Create and update user authentication files in DBM format CGI::Fast (3)- CGI Interface for Fast CGI CGI (3)- Simple Common Gateway Interface Class CGI::Apache (3)- Make things work with CGI.pm against Perl-Apache API CGI::Carp (3)- CGI routines for writing to the HTTPD (or other) error log CGI::Cookie (3)- Interface to Netscape Cookies CGI::Fast (3)- CGI Interface for Fast CGI CGI::Push (3)- Simple Interface to Server Push CGI::Switch (3)- Try more than one constructors
Согласитесь более цивилизованный вид. Данную команду можно запихнуть в ваш .bashrc в виде функции:
$ cat # .bashrc ......... # User specific aliases and functions if [ "$PS1" -a -f ~/lib/advhist.sh ]; then manK() { man -wK $1 | sed 's?.\+/\([^.]\+\)\.\([0-9]\+\).*$?\2 -f \1?' | xargs man } fi ........
После этого желаемый результат достигается командой manK httpd, вместо того заклинания которое вы видели выше.
Еще посоветую при поиске информации обязательно заглядывать в секцию SEE ALSO, в которой могут быть масса полезных ссылок.
Вот в общем и все что я хотел сказать по поводу man. Надеюсь теперь вам будет намного легче найти требуемую информацию.
....продолжение следует.....