GNU/Linux >> Tutoriales Linux >  >> Linux

¿Hay alguna manera de buscar una bandera en una página de manual?

La útil respuesta de rici explica bien el problema con el enfoque original.

Sin embargo, hay otra cosa que vale la pena mencionar:

man La salida contiene caracteres de control de formato , que interfieren con las búsquedas de texto .

Si conduce a col -b antes de buscar , estos caracteres de control se eliminan; tenga en cuenta el efecto secundario de que los resultados de la búsqueda también serán texto sin formato.

Sin embargo, grep no es la herramienta adecuada para este trabajo; Sugiero usar awk de la siguiente manera para obtener la descripción de -O :

man gcc | col -b | awk -v RS= '/^\s+-O\n/'
  • RS= (un separador de registro de entrada vacío) es un modismo awk que divide la entrada en bloques de líneas no vacías, por lo que hacer coincidir la opción al comienzo de dicho bloque garantiza que todas las líneas comprendan la descripción de la opción son devueltos.

Si tiene un awk solo con funciones POSIX como BSD/OSX awk , usa esta versión:

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

Obviamente, tal comando es algo engorroso de escribir, así que busque genérico bash función manopt a continuación, que devuelve la descripción de la opción especificada para el comando especificado desde su man página . (Puede haber falsos positivos y negativos, pero en general funciona bastante bien).

Ejemplos:

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 función manopt() - colocar en ~/.bashrc , por ejemplo:

# 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 implementación de manopt() :

Contribución de 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

Sospecho que en realidad no usaste grep $'-O\n' , sino alguna bandera reconocida por grep .

Desde el punto de vista de grep, simplemente está pasando un argumento, y ese argumento comienza con un - por lo que va a ser interpretado como una opción. Tienes que hacer algo como grep -- -O$ para marcar explícitamente el final de la lista de opciones, o grep -e -O$ para marcar explícitamente el patrón como un patrón. En cualquier caso, no puede incluir una nueva línea en un patrón porque los patrones grep son en realidad listas de patrones separados por caracteres de nueva línea, por lo que el argumento $'foo\n' en realidad son dos patrones, foo y la cadena vacía, y la cadena vacía coincidirá con cada línea.

Quizás buscaste la bandera -e ya que eso toma un patrón como argumento, y darle una nueva línea como argumento hará que grep encuentre cada línea en todo el archivo.

Para la mayoría de los programas GNU, como gcc, puede encontrar el info interfaz más fácil de navegar, ya que incluye enlaces de referencia, tablas de contenido e incluso índices. El info gcc El documento incluye un índice de opciones, que es muy útil. En algunas distribuciones de linux, y algo sorprendente ya que se autodenominan distribuciones GNU/linux, es necesario instalar por separado info paquetes aunque man Los archivos se distribuyen con el software base. El paquete debian/ubuntu que contiene el gcc info archivos se llama gcc-doc , por ejemplo. (El uso del -doc el sufijo del nombre del paquete es bastante común.)

En el caso de gcc puede encontrar rápidamente una opción usando un comando como:

info gcc "option index" O

o

info gcc --index-search=funroll-loops

Para programas con menos opciones, generalmente es lo suficientemente bueno usar el -O de info opción:

info -O gawk

Linux
  1. ¿Hay alguna forma de que los procesos no raíz se vinculen a puertos privilegiados en Linux?

  2. ¿Hay alguna manera de 'uniq' por columna?

  3. Buscar una opción específica en una página man

  4. ¿Hay alguna manera de reiniciar badblocks?

  5. ¿Hay alguna manera de hacer que los sistemas de archivos ext usen menos espacio para ellos mismos en Linux?

Cómo encontrar la página man más larga en Linux

¿Existe un cliente de OneDrive para Linux?

¿Cómo agregar entradas a la página de manual para las propias herramientas eléctricas?

¿Caracteres de cita de la página de manual?

¿Hay alguna manera de escuchar el proceso?

Abra la página de manual y busque una cadena en un solo comando