web-dev-qa-db-fra.com

grep la page de manuel d'une commande pour les options avec trait d'union

Supposons que je veuille connaître l'utilisation du commutateur -i dans la commande grep sans défilement. J'ai besoin de la spécification juste pour cette commande ou au moins, je vois l'écran montrer ceci en premier. Alors comment? Comme vous pouvez le dire en général, pas seulement pour grep -i.

18

Essayez cette simple commande sed,

$ man grep | sed -n '/-i, --ignore-case/,+2p'
    -i, --ignore-case
              Ignore  case  distinctions  in  both  the  PATTERN and the input
              files.  (-i is specified by POSIX.)

Explication:

sed -n '/-i, --ignore-case/,+2p'

        |<-Search pattern->|

Il imprimera la ligne contenant le motif de recherche ainsi que 2 lignes qui se trouvent juste en dessous de la ligne du motif de recherche.

OR

Vous pouvez simplement donner uniquement les drapeaux dans le champ de recherche, comme ci-dessous.

avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *i, -/,+3p'
       -i, --ignore-case
              Ignore  case  distinctions  in  both  the  PATTERN and the input
              files.  (-i is specified by POSIX.)

avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *V, -/,+3p'
       -V, --version
              Print  the version number of grep to the standard output stream.
              This version number should be included in all bug  reports  (see
              below).
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *F, -/,+3p'
       -F, --fixed-strings
              Interpret PATTERN as a  list  of  fixed  strings,  separated  by
              newlines,  any  of  which is to be matched.  (-F is specified by
              POSIX.)
avinash@avinash-Lenovo-IdeaPad-Z500:~$ man grep | sed -n '/ *G, -/,+3p'
       -G, --basic-regexp
              Interpret PATTERN  as  a  basic  regular  expression  (BRE,  see
              below).  This is the default.

Vous pouvez ajouter ce script à votre .bashrc ($HOME/.bashrc) pour un accès rapide:

mangrep(){
    USAGE="mangrep <application> <switch>"
    if [[ "$#" -ne "2" ]]
      then
          echo "Usage: $USAGE"
      else
          man "$1" | sed -n "/ *"$2", -/,+3p"
    fi
}
13
Avinash Raj

Tapez la commande ci-dessous sur le terminal:

man grep

Puis tapez slash character, /et écrivez votre recherche, comme -i, suivie de Enter. Cela positionnera le curseur à la première occurrence de la chaîne de recherche. Pressage n déplace le curseur sur l'occurrence suivante. Pressage Shift+n déplace le curseur sur l'occurrence précédente.

22
girardengo

Bien que l’approche la plus simple consiste à rechercher avec / comme suggéré par @girardengo, vous pouvez également utiliser grep au lieu de sed que je trouve plus simple:

$ man grep | grep -A 1 '^ *-i'
   -i, --ignore-case
          Ignore  case  distinctions  in  both  the  PATTERN and the input
          files.  (-i is specified by POSIX.)

Le -A N signifie "Imprimez N lignes après la correspondance. Juste une astuce pour obtenir les prochaines lignes, similaire à l'approche d'Avinashsed.

8
terdon

Ou, vous pouvez laisser ce site faire la recherche pour vous:

http://explainshell.com/explain?cmd=grep+-i

Vous devez passer du navigateur à l’utilisation du terminal pour un moment, mais il ya aussi des moyens de contourner ce problème .

3
Tom

Vous pouvez utiliser la fonction de recherche à l'intérieur de man, il vous suffit d'appuyer sur "s", de taper la clé que vous recherchez, (-i dans votre cas) et d'appuyer sur intro.

3
animaletdesequia

La méthode la plus efficace que je connaisse consiste à effectuer une recherche dans la page de manuel pour -i (Ce site semble ne pas pouvoir restituer mon code. Ce que je veux dire, c'est <space><space><space>-i). C'est 3 espaces (vous aurez peut-être besoin de plus/moins d'espaces) suivis du drapeau que vous recherchez. Selon mon expérience, cela fonctionne presque toujours, et vous pouvez en changer dans les cas où cela ne fonctionnerait pas.

Cela fonctionne parce que la documentation des drapeaux est généralement indentée. Cela évite de trouver d'autres mentions du drapeau dans d'autres sections, car il n'y a généralement qu'un espace devant elles.

2
Harold R. Eason

Mon approche préférée pour trouver une option donnée dans une page man consiste à utiliser une expression rationnelle telle que \s{2,}-option. Pour la question en question, vous pouvez faire man grep puis taper la regex:

/\s{3,}-i

ou

/ {3,}-i
 ^------------- space here

Ceci ne correspond à -i que s'il est suivi d'au moins trois espaces.

1
Sergio

Vous pouvez utiliser Perl et son "mode paragraphe" pour extraire uniquement le paragraphe pertinent:

man grep | Perl -00 -ne 'print if / -i/'
1
choroba

Toutes les réponses peuvent être bonnes, mais je pense que vous ne vous concentrez que sur une partie de la documentation, pas sur toutes. Par exemple, pour trouver le commutateur -i de la documentation de grep:

info grep Invoking Command-line\ Options Matching\ Control

Je vais trouver toutes les informations sur "grep", comment "appeler" les "options de ligne de commande" spécifiques pour "contrôle correspondant". Malheureusement, cela ne va pas plus loin que cela, mais il y a -i, -y, --ignore-case dans les 25 premières lignes, ce qui est raisonnable, vous n'avez pas à faire défiler tout votre chemin vers le bas.

Cette solution est la plus flexible et vous permet également de rechercher toutes les infopages:

info --apropos=--ignore-case
"(coreutils)join invocation" -- --ignore-case <1>
"(coreutils)uniq invocation" -- --ignore-case <2>
"(coreutils)sort invocation" -- --ignore-case
"(gettext)msggrep Invocation" -- --ignore-case, ‘msggrep’ option
"(grep)Matching Control" -- --ignore-case

(Doit utiliser --ignore-case au lieu de -i car il était trop commun, mais vous pouvez simplement traiter la sortie en info dans tous les cas)

Dans ce cas, vous avez à la fois le nom de la page d’information et la section exacte. Ah, presque oublié, vous pouvez aussi juste tab votre chemin à travers la plupart des sections des pages d’informations.

1
Braiam

Si vous voulez grep le man <program> pour un motif commençant par un trait d'union, utilisez -- avant le motif que vous spécifiez. Exemple utilisant man find:

man find | grep -- -type

Si vous souhaitez plus d'informations, par exemple l'intégralité de la section décrivant une option, essayez d'utiliser sed:

$ man find | sed -n '/-mindepth/,/^$/p'
   -mindepth levels
          Do  not apply any tests or actions at levels less than levels (a
          non-negative integer).  -mindepth  1  means  process  all  files
          except the command line arguments.

Source

0
karel

Comme less est utilisé par défaut comme pageur pour man, vous pouvez utiliser la variable d'environnement LESS pour transmettre un modèle à rechercher lorsque less ouvre la page. Ceci est identique à faire par exemple man ls, puis en recherchant l'option --all ou -a en tapant / puis entrer le motif, par ex. --all ou -a.

Tout cela peut être fait par:

LESS='+/--all' man ls

Ou

LESS='+/-a' man ls

Entrez ce que vous voulez rechercher après /.

Cela fonctionne probablement mieux pour les options longues (par exemple --all) que pour les options courtes (par exemple -a).

0
heemayl