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

fer*_*raz 8 unix linux bash sh less-unix

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

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

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

mkl*_*nt0 8

rici的有用答案很好地解释了原始方法的问题.

但是,还有一件值得一提的事:

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

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

但是,grep这项工作不适合; 我建议使用awk如下获取描述-O:

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

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

man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'
Run Code Online (Sandbox Code Playgroud)

显然,这样的命令输入有点麻烦,所以找下面的泛型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'
Run Code Online (Sandbox Code Playgroud)

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:]]|$)"'
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


ric*_*ici 5

我怀疑您实际上并没有使用grep $'-O\n',而是使用了grep.

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

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

对于大多数 GNU 程序,例如 gcc,您可能会发现该info界面更易于浏览,因为它包括参考链接、目录甚至索引。该info gcc文档包含一个选项索引,非常有用。在一些 linux 发行版中,有些令人惊讶的是,因为它们称自己为 GNU/linux 发行版,info尽管man文件与基本软件一起分发,但有必要单独安装软件包。例如,包含 gccinfo文件的 debian/ubuntu 包称为gcc-doc。(-doc包名后缀的使用很常见。)

在这种情况下,gcc您可以使用以下命令快速找到一个选项:

info gcc "option index" O
Run Code Online (Sandbox Code Playgroud)

或者

info gcc --index-search=funroll-loops
Run Code Online (Sandbox Code Playgroud)

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

info -O gawk
Run Code Online (Sandbox Code Playgroud)

  • @ferhtgoldaraz:您可能想要使用`-A1` 或类似的东西(“`-A NUM` 在匹配行之后打印 NUM 行尾随上下文。”) (2认同)