有没有办法对手册页进行全文搜索,并从像这样的控制台获取相关手册页的名称和描述列表apropos(1)
?
您可以使用 全文搜索手册页的内容man -K
。但存在三个问题:
man -K
不向控制台显示第一个结果的标题。man -K
仅显示联机帮助页的标题,如下所示:--Man-- next: ansible(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]
man -K
需要Ctrl-D
跳过查看联机帮助页的内容。因此您不能使用yes(1)
将响应传递给man -K
.
答案1
可能有一种更简单的方法,但我发现man -K
可以与 结合起来-w
打印包含搜索词的文件的路径,并且您可以将其与lexgrog
例如提取 Whatis 信息结合起来:
$ man -Kws1 apropos | sort -u | xargs -rd '\n' lexgrog | perl -pe's/.*?: "(.*)"/$1/'
apropos - search the manual page names and descriptions
emacs - GNU project Emacs editor
groffer - display groff files and man pages on X and tty
info - read Info documents
lexgrog - parse header information in man pages
man - an interface to the system reference manuals
manpath - determine search path for manual pages
scanimage - scan an image
whatis - display one-line manual page descriptions
xman - Manual page display program for the X Window System
(这里假设 GNUxargs
代表它-r
和-d
选项,尽管后者不太可能是必要的)
您可以将其转换为full-apropos
脚本或函数,例如:
#! /bin/sh -
man -Kw "$@" |
sort -u |
xargs -rd '\n' lexgrog |
perl -pe's/.*?: "(.*)"/$1/'
但我们缺少 man 部分的信息。由于它位于文件的路径中,因此我们可以使用以下内容将其添加回来:
#! /bin/sh -
man -Kw "$@" |
sort -u |
while IFS= read -r file; do
section=${file%/*}
section=${section##*/man}
lexgrog -- "$file" |
perl -spe's/.*?: "(.*)"/$1/; s/ - / ($s)$&/' -- "-s=$section"
done