有没有办法在手册页中查找标志?

时间:2013-10-05 14:11:33

标签: linux bash unix sh less-unix

我正试图想出一种在man-page中找到特定标志的方法。通常,我输入'/' 搜索某些内容,然后搜索“-Werror”之类的内容以查找特定标记。 事情是,虽然有man-pages(gcc是现在激励我的那个) 在文本中有很多对标志的引用,所以有很多事情发生。

这不是什么大不了的事,但也许它可以做得更好。我想找 像'-O \ n'之类的东西,但它不起作用(可能是因为man程序不使用C转义?) 然后我尝试了类似man gcc | grep $'-O\n'的东西,因为我有点回忆起那个问题 以美元符号开头的单引号字符串有bash解释常见的C转义... 它没有用,grep回应整个人页。

这就是我带到这里的原因:为什么?或者更确切地说,这可以做到吗?

8 个答案:

答案 0 :(得分:7)

rici's helpful answer很好地解释了原始方法的问题。

然而,还有另外值得一提的是:

man的输出包含格式控制字符,会干扰文字搜索

如果在搜索之前输入col -b,则会删除这些控制字符 - 请注意搜索结果也是纯文本的副作用。

然而, grep不适合这项工作;我建议使用awk ,如下所示,以获取-O

的说明
man gcc | col -b | awk -v RS= '/^\s+-O\n/'
  • RS=(一个空的输入记录分隔符)是一个awk习惯用法,它将输入分解为非空行的块,因此匹配这个块开头的选项可确保所有行包含选项的描述将被返回。

如果您有POSIX功能awk,例如BSD / OSX awk,请使用此版本:

man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'

显然,输入这样的命令有些麻烦,所以在下面找到泛型bash函数manopt ,其中返回指定选项的描述来自man页面的指定命令。 (可能存在误报和否定,但总的来说效果非常好。)

示例:

manopt gcc O          # search `man gcc` for description of `-O`
manopt grep regexp    # search `man grep` for description of `--regexp`
manopt find '-exec.*' # search `man find` for all actions _starting with_ '-exec'

bash函数manopt() - 放在~/.bashrc中,例如:

# SYNOPSIS
#   manopt command opt
#
# DESCRIPTION
#   Returns the portion of COMMAND's man page describing option OPT.
#   Note: Result is plain text - formatting is lost.
#
#   OPT may be a short option (e.g., -F) or long option (e.g., --fixed-strings);
#   specifying the preceding '-' or '--' is OPTIONAL - UNLESS with long option
#   names preceded only by *1* '-', such as the actions for the `find` command.
#
#   Matching is exact by default; to turn on prefix matching for long options,
#   quote the prefix and append '.*', e.g.: `manopt find '-exec.*'` finds
#   both '-exec' and 'execdir'.
#
# EXAMPLES
#   manopt ls l           # same as: manopt ls -l
#   manopt sort reverse   # same as: manopt sort --reverse
#   manopt find -print    # MUST prefix with '-' here.
#   manopt find '-exec.*' # find options *starting* with '-exec'
manopt() {
  local cmd=$1 opt=$2
  [[ $opt == -* ]] || { (( ${#opt} == 1 )) && opt="-$opt" || opt="--$opt"; }
  man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
}

fish manopt()的实施:

Ivan Aracki提供。

function manopt 
  set -l cmd $argv[1]
  set -l opt $argv[2] 
  if not echo $opt | grep '^-' >/dev/null
    if [ (string length $opt) = 1 ] 
      set opt "-$opt"
    else
      set opt "--$opt"
    end
  end
  man "$cmd" | col -b | awk -v opt="$opt" -v RS= '$0 ~ "(^|,)[[:blank:]]+" opt "([[:punct:][:space:]]|$)"'
end

答案 1 :(得分:3)

我怀疑您实际上并未使用grep $'-O\n',而是使用grep识别的某些标记。

从grep的角度来看,你只是传递一个参数,并且该参数以-开头,所以它将被解释为一个选项。您需要执行grep -- -O$之类的操作来显式标记选项列表的结尾,或grep -e -O$将模式明确标记为模式。在任何情况下,您都不能在模式中包含换行符,因为grep模式实际上是由换行符分隔的模式列表,因此参数$'foo\n'实际上是两个模式foo和空字符串,以及空字符串将匹配每一行。

也许您搜索了标志-e,因为它将模式作为参数,并给它一个换行作为参数将导致grep找到整个文件中的每一行。

对于大多数GNU程序,例如gcc,您可能会发现info界面更容易导航,因为它包含引用链接,目录甚至索引。 info gcc文档包含选项索引,这非常有用。在一些Linux发行版中,有点令人惊讶的是,因为它们称自己为GNU / linux发行版,所以必须单独安装info包,尽管man文件随基础软件一起分发。例如,包含gcc info文件的debian / ubuntu包称为gcc-doc。 (对包名称使用-doc后缀非常常见。)

gcc的情况下,您可以使用如下命令快速找到选项:

info gcc "option index" O

info gcc --index-search=funroll-loops

对于选项较少的程序,通常使用info -O选项就足够了:

info -O gawk

答案 2 :(得分:1)

问题是“男人”使用的是寻呼机,通常是“少”,其人工页面说明:

/pattern
    Search  forward  in  the file for the N-th line containing the pattern.
    N defaults to 1.  The pattern is a regular expression, as recognized by the
    regular expression library supplied by your system.  The search starts at the
    first line displayed (but see the -a and -j options, which change this).

所以人们可以尝试在一个手册页中寻找'-O $',找到一个独自存在于其中的旗帜 自己的路线。虽然,在同一行中,一个标志后跟文本是很常见的, 所以这不能保证工作。

grep和$' - O \ n'的问题仍然是一个谜。

答案 3 :(得分:0)

man gcc | grep "\-" 

这很好用,因为它显示所有标志,通常不多。

编辑:我注意到我没有完全回答你的问题,但我希望我的建议可以被认为是一个不错的选择。

答案 4 :(得分:0)

man基于环境变量(如果我没有误会,则为EDITOR)。您可以将其从more(默认值)更改为emacs,然后在使用man时在系统上打开emacs会话,您可以在其中随心搜索和浏览。

答案 5 :(得分:0)

我使用以下方法:

man some_command | col -b | grep -A5 -- 'your_request'

示例:

  • man man | col -b | grep -A5 -- '-K'

  • man grep | col -b | grep -A5 -- '-e patt'

您可以为其命名。

答案 6 :(得分:0)

manly Python实用工具非常方便,可以快速解释给定命令中使用的所有选项。

请注意,它仅输出选项说明的第一段。

execution 'ANDROIDX_TEST_ORCHESTRATOR'
pip install manly

答案 7 :(得分:0)

大多数bash内置命令和许多其他命令中使用双破折号(-)表示命令选项的结束

https://unix.stackexchange.com/a/11382/204245

在没有双破折号的情况下,grep尝试使用您要查找的任何标志:

$ man curl | grep -c # Looks for this c flag, but can't find one so throws the error below.
usage: grep [-abcDEFGHhIiJLlmnOoqRSsUVvwxZ] [-A num] [-B num] [-C[num]]
    [-e pattern] [-f file] [--binary-files=value] [--color=when]
    [--context[=num]] [--directories=action] [--label] [--line-buffered]
    [--null] [pattern] [file ...]

如果您使用双破折号来表示对grep的输入结束,则效果会更好一些,但仍然会导致次匹配:

$ man curl | grep -- -c
       --cacert <file>
              certs file named 'curl-ca-bundle.crt', either in the same direc-
       --capath <dir>
              curl to make SSL-connections much more  efficiently  than  using
              --cacert if the --cacert file contains many CA certificates.
       --cert-status
       --cert-type <type>
       -E, --cert <certificate[:password]>
       --ciphers <list of ciphers>
# ...many more matches......

因此,只需将标志用引号引起来,并在其前只添加-c标志即可:

$ man curl | grep -- " -c"
       -c, --cookie-jar <filename>

这使我发疯了很多年。希望这会有所帮助。