GNU/Linux >> Tutoriels Linux >  >> Linux

Existe-t-il un moyen de rechercher un drapeau dans une page de manuel ?

La réponse utile de Rici explique bien le problème avec l'approche originale.

Cependant, il y a une autre chose qui mérite d'être mentionnée :

man La sortie de contient des caractères de contrôle de mise en forme , qui interfèrent avec les recherches textuelles .

Si vous dirigez vers col -b avant de chercher , ces caractères de contrôle sont supprimés - notez l'effet secondaire que les résultats de la recherche seront également en texte brut.

Cependant, grep n'est pas le bon outil pour ce travail ; Je suggère d'utiliser awk comme suit pour obtenir la description de -O :

man gcc | col -b | awk -v RS= '/^\s+-O\n/'
  • RS= (un séparateur d'enregistrement d'entrée vide) est un idiome awk qui divise l'entrée en blocs de lignes non vides, donc faire correspondre l'option au début d'un tel bloc garantit que toutes les lignes comprenant la description de l'option sont retournés.

Si vous avez un awk de fonctionnalités POSIX uniquement comme BSD/OSX awk , utilisez cette version :

man gcc | col -b | awk -v RS= '/^[[:blank:]]+-O\n/'

Évidemment, une telle commande est quelque peu lourde à taper, alors trouvez generic bash fonction manopt ci-dessous, qui renvoie la description de l'option spécifiée pour la commande spécifiée à partir de son man pages . (Il peut y avoir des faux positifs et des faux négatifs, mais dans l'ensemble, cela fonctionne plutôt bien.)

Exemples :

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 fonction manopt() - placer en ~/.bashrc , par exemple :

# 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 implémentation de manopt() :

Contribution d'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

Je soupçonne que vous n'avez pas réellement utilisé grep $'-O\n' , mais plutôt un indicateur reconnu par grep .

Du point de vue de grep, vous passez simplement un argument, et cet argument commence par un - donc ça va être interprété comme une option. Vous devez faire quelque chose comme grep -- -O$ pour signaler explicitement la fin de la liste des options, ou grep -e -O$ pour signaler explicitement le modèle en tant que modèle. Dans tous les cas, vous ne pouvez pas inclure une nouvelle ligne dans un modèle car les modèles grep sont en fait des listes de modèles séparés par des caractères de nouvelle ligne, donc l'argument $'foo\n' est en fait deux modèles, foo et la chaîne vide, et la chaîne vide correspondra à chaque ligne.

Peut-être avez-vous recherché le drapeau -e puisque cela prend un motif comme argument, et lui donner une nouvelle ligne comme argument fera que grep trouvera chaque ligne dans tout le fichier.

Pour la plupart des programmes GNU, tels que gcc, vous pouvez trouver le info interface plus facile à naviguer, car elle comprend des liens de référence, des tables des matières et même des index. Le info gcc document comprend un index des options, ce qui est très utile. Dans certaines distributions Linux, et de manière quelque peu surprenante puisqu'elles s'appellent elles-mêmes des distributions GNU/linux, il est nécessaire d'installer séparément info paquets bien que man les fichiers sont distribués avec le logiciel de base. Le paquet debian/ubuntu contenant le gcc info les fichiers s'appellent gcc-doc , par exemple. (L'utilisation du -doc suffixe au nom du package est assez courant.)

Dans le cas de gcc vous pouvez rapidement trouver une option en utilisant une commande comme :

info gcc "option index" O

ou

info gcc --index-search=funroll-loops

Pour les programmes avec moins d'options, il est généralement suffisant d'utiliser le -O d'info choix :

info -O gawk

Linux
  1. Existe-t-il un moyen pour les processus non root de se lier à des ports privilégiés sous Linux ?

  2. Pas de page de manuel pour la commande cd

  3. Existe-t-il un moyen de redémarrer les badblocks ?

  4. Existe-t-il un moyen de faire en sorte que les systèmes de fichiers ext utilisent moins d'espace pour eux-mêmes sous Linux?

  5. Existe-t-il un moyen d'arrêter d'avoir à écrire 'sudo' pour chaque petite chose sous Linux ?

Comment trouver la page de manuel la plus longue sous Linux

Existe-t-il un client OneDrive pour Linux ?

Comment ajouter des entrées de page de manuel pour les propres outils électriques ?

Caractères de citation de page d'homme ?

Existe-t-il un moyen d'obtenir les ratios Cache Hit/Miss pour les périphériques de bloc sous Linux ?

Existe-t-il un moyen d'obtenir l'utilisation actuelle de txqueue, par exemple. périphérique eth0 ou tun ?