我正试图想出一种在man-page中找到特定标志的方法。通常,我输入'/' 搜索某些内容,然后搜索“-Werror”之类的内容以查找特定标记。 事情是,虽然有man-pages(gcc是现在激励我的那个) 在文本中有很多对标志的引用,所以有很多事情发生。
这不是什么大不了的事,但也许它可以做得更好。我想找
像'-O \ n'之类的东西,但它不起作用(可能是因为man程序不使用C转义?)
然后我尝试了类似man gcc | grep $'-O\n'
的东西,因为我有点回忆起那个问题
以美元符号开头的单引号字符串有bash解释常见的C转义...
它没有用,grep回应整个人页。
这就是我带到这里的原因:为什么?或者更确切地说,这可以做到吗?
答案 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>
这使我发疯了很多年。希望这会有所帮助。