Как использовать grep для поиска в выводе --help?

При использовании grep или egrep для поиска выходных данных из программы с параметром --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]

Как это решить? Спасибо за любую помощь!

7
задан 10 August 2019 в 22:00

3 ответа

ssh-keygen команда не имеет a --help опция, таким образом, это печатает “неизвестную опцию” ошибка, тихо думает “прочитайте руководство” и производит справку. Это делает это не на stdout, а на stderr, который не передается по каналу с | но только с |& (который является a 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]

Дальнейшее чтение

15
ответ дан 23 November 2019 в 06:12

Если то, что Вы ищете, является справкой на попытке команды ssh-keygen

man ssh-keygen | grep known_hosts

Или, можно сделать man ssh-keygen из командной строки и затем нажимают / и вводят критерий поиска, например, "kno", нажимают Enter, используют n для продолжения к следующему экземпляру критерия поиска (man man для большего количества информации об использовании man). Отметьте man ищите только поиски вниз, так используйте PgUp или Домой возвратиться к запуску ручной записи прежде, чем запустить новый поиск.

2
ответ дан 23 November 2019 в 06:12

Вы звоните ssh-keygen с несуществующей опцией. Это - ошибка, и вывод ошибок появляется на stderr. Это не появляется как ssh-keygen имеет регулярную опцию для вывода ее использования: если это имело (как программы GNU, имеют по умолчанию с --help), тот "регулярный" вывод появился бы на stdout и был бы доступен для меньше в канале, который Вы использовали.

Вы можете клудж вокруг этого использования ssh-keygen --help 2>&1 | grep -e "-p" : 2>&1 перенаправления stderr к stdout, где канал может поймать его, и -e поскольку опция к grep означает, что "следующее является regexp, чтобы использовать, даже если это похоже на опцию".

man ssh-keygen должен работать лучше на получение использования и передаст по каналу в less по умолчанию, где можно искать регулярные выражения с / , и чтение в контексте обычно является лучшим выбором.

2
ответ дан 23 November 2019 в 06:12

Другие вопросы по тегам:

Похожие вопросы: