如何使用 grep 搜索 --help 输出?

如何使用 grep 搜索 --help 输出?

当使用grepegrep搜索带有--help参数的程序的输出时,它会打印完整的输出而不是匹配的行。

例子:

ssh-keygen --help | grep "known_hosts"
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       // etc

当搜索参数时,例如ssh-keygen --help | grep "-p"grep 会自行识别此参数。转义破折号(即grep "\-p")没有帮助。

例子:

ssh-keygen --help | grep "-p"         
grep: invalid option -- 'p'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
unknown option -- -
usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]
                  [-N new_passphrase] [-C comment] [-f output_keyfile]
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]
       ssh-keygen -i [-m key_format] [-f input_keyfile]
       ssh-keygen -e [-m key_format] [-f input_keyfile]
       ssh-keygen -y [-f input_keyfile]
       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]
       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
       ssh-keygen -B [-f input_keyfile]

如何解决这个问题?谢谢您的帮助!

答案1

ssh-keygen命令没有--help选项,因此它会打印“未知选项”错误,默默地想“RTFM”并输出帮助。它不是在 stdout 上执行此操作,而是在标准错误,它不是通过 管道传输的|,而只是通过 管道传输的|&(这是 的bash简写2>&1 |):

$ ssh-keygen --help |& grep "known_hosts"
       ssh-keygen -F hostname [-f known_hosts_file] [-l]
       ssh-keygen -H [-f known_hosts_file]
       ssh-keygen -R hostname [-f known_hosts_file]

一个完全不同的问题是,grep由于搜索表达式以连字符开头,因此将其识别为选项。幸运的是,grep有众多命令可以识别“选项结尾”--选项,并将其后面的所有内容作为参数而不是选项:

$ ssh-keygen --help |& grep -- -p
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

man grep甚至没有提到它,但是这里是bash手册中对此选项的描述:

A--表示选项结束并禁用进一步的选项处理。 之后的任何参数--都被视为文件名和参数。

grep还提供了第二种方法来处理以“-”开头的模式:该-e选项以模式作为其参数,因此以下情况同样可能:

$ ssh-keygen --help |& grep -e -p
       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]

进一步阅读

答案2

ssh-keygen使用不存在的选项进行调用。这是一个错误,错误输出会出现在 stderr 上。它似乎没有ssh-keygen常规选项来输出其用法:如果它有(就像 GNU 程序默认使用 一样--help),那么“常规”输出将出现在 stdout 上,并且可以在您使用的管道中被 less 访问。

您可以使用以下方法解决这个问题ssh-keygen --help 2>&1 | grep -e "-p"2>&1将 stderr 重定向到 stdout,管道可以在其中捕获它,并且-e作为 grep 的选项意味着“以下是即使看起来像一个选项,也要使用的正则表达式”。

man ssh-keygen应该更好地获取用法,并且less默认进入管道,您可以使用搜索正则表达式/,并且在上下文中阅读通常是更好的选择。

答案3

如果你正在寻找有关 ssh-keygen 命令的帮助,请尝试

man ssh-keygen | grep known_hosts

或者,您可以man ssh-keygen从命令行执行,然后按下/并键入搜索词,例如“kno”,按下Enter,使用n继续到搜索词的下一个实例(man man有关使用的更多信息man)。请注意,man搜索仅向下搜索,因此在开始新搜索之前,使用PgUpHome返回到手动输入的开头。

相关内容