全文搜索手册页并从 apropos(1) 等控制台获取名称和描述列表

全文搜索手册页并从 apropos(1) 等控制台获取名称和描述列表

有没有办法对手册页进行全文搜索,并从像这样的控制台获取相关手册页的名称和描述列表apropos(1)

您可以使用 全文搜索手册页的内容man -K。但存在三个问题:

  1. man -K不向控制台显示第一个结果的标题。

  2. man -K仅显示联机帮助页的标题,如下所示:

    --Man-- next: ansible(1) [ view (return) | skip (Ctrl-D) | quit (Ctrl-C) ]

  3. 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

相关内容