GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Gibt es eine Möglichkeit, in einer Manpage nach einem Flag zu suchen?

Die hilfreiche Antwort von rici erklärt das Problem mit dem ursprünglichen Ansatz gut.

Es gibt jedoch noch etwas Erwähnenswertes:

man Die Ausgabe von enthält Formatierungssteuerzeichen , die die Textsuche beeinträchtigen .

Wenn Sie an col -b leiten vor der Suche , werden diese Steuerzeichen entfernt - beachten Sie den Nebeneffekt, dass die Suchergebnisse auch im Klartext vorliegen.

Jedoch grep ist nicht das richtige Werkzeug für diesen Job; Ich schlage vor, awk zu verwenden wie folgt, um die Beschreibung von -O zu erhalten :

man gcc | col -b | awk -v RS= '/^\s+-O\n/'
  • RS= (ein leeres Eingabedatensatz-Trennzeichen) ist ein awk-Idiom, das die Eingabe in Blöcke von nicht leeren Zeilen aufteilt, sodass der Abgleich der Option am Anfang eines solchen Blocks sicherstellt, dass alle Zeilen, die die Beschreibung der Option enthalten zurückgegeben werden.

Wenn Sie nur POSIX-Features haben awk wie BSD/OSX awk , verwenden Sie diese Version:

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

Offensichtlich ist die Eingabe eines solchen Befehls etwas umständlich, also finden Sie generic bash Funktion manopt unten, die die Beschreibung der angegebenen Option für den angegebenen Befehl aus seinem man zurückgibt Seite . (Es kann falsch positive und negative Ergebnisse geben, aber insgesamt funktioniert es ziemlich gut.)

Beispiele:

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 Funktion manopt() - in ~/.bashrc platzieren , zum Beispiel:

# 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 Implementierung von manopt() :

Beigesteuert von 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

Ich vermute, Sie haben grep $'-O\n' nicht wirklich verwendet , sondern ein Flag, das von grep erkannt wird .

Aus Sicht von grep übergeben Sie einfach ein Argument, und dieses Argument beginnt mit einem - also wird es als Option interpretiert. Sie müssen so etwas wie grep -- -O$ tun um das Ende der Optionsliste explizit zu kennzeichnen, oder grep -e -O$ um das Muster explizit als Muster zu kennzeichnen. Auf jeden Fall können Sie keinen Zeilenumbruch in ein Muster einfügen, da grep-Muster eigentlich Listen von Mustern sind, die durch Zeilenumbruchzeichen getrennt sind, also das Argument $'foo\n' ist eigentlich zwei Muster, foo und die leere Zeichenfolge, und die leere Zeichenfolge passt zu jeder Zeile.

Vielleicht haben Sie nach dem Flag -e gesucht da dies ein Muster als Argument nimmt, und wenn Sie ihm einen Zeilenumbruch als Argument geben, wird grep jede Zeile in der gesamten Datei finden.

Für die meisten GNU-Programme, wie z. B. gcc, finden Sie möglicherweise den info Benutzeroberfläche einfacher zu navigieren, da sie Referenzlinks, Inhaltsverzeichnisse und sogar Indizes enthält. Der info gcc Das Dokument enthält einen Index der Optionen, was sehr nützlich ist. In einigen Linux-Distributionen, und etwas überraschend, da sie sich GNU/Linux-Distributionen nennen, ist es notwendig, info separat zu installieren Pakete obwohl man Dateien werden mit der Basissoftware verteilt. Das debian/ubuntu-Paket, das den gcc info enthält Dateien heißt gcc-doc , zum Beispiel. (Die Verwendung des -doc Suffix zum Paketnamen ist durchaus üblich.)

Im Fall von gcc Sie können eine Option schnell finden, indem Sie einen Befehl wie diesen verwenden:

info gcc "option index" O

oder

info gcc --index-search=funroll-loops

Für Programme mit weniger Optionen reicht es normalerweise aus, -O von info zu verwenden Möglichkeit:

info -O gawk

Linux
  1. Weg zum Durchsuchen von Manpages für ein typisches Anwendungsszenario?

  2. Gibt es eine Möglichkeit für Nicht-Root-Prozesse, sich an privilegierte Ports unter Linux zu binden?

  3. Gibt es eine Möglichkeit, Badblocks neu zu starten?

  4. Gibt es eine Möglichkeit, Ext-Dateisysteme dazu zu bringen, in Linux weniger Speicherplatz für sich selbst zu belegen?

  5. Gibt es ein Äquivalent zu cd - für cp oder mv?

So finden Sie die längste Manpage in Linux

Gibt es einen OneDrive-Client für Linux?

Wie füge ich Manpage-Einträge für die eigenen Power Tools hinzu?

Manpage-Zitatzeichen?

Wo ist die Manpage für die C-Funktion „sizeof“?

Gibt es eine Möglichkeit, Text in htop zu kopieren?