grep dentro menos?

58

Actualmente estoy revisando muchos registros desconocidos en busca de algunos problemas. El primer archivo que miro es Events.log, y obtengo al menos tres páginas en las lessque parece que se muestra el mismo evento en diferentes momentos, un evento que parece ser bastante benigno. Me gustaría filtrar este evento, y actualmente renuncio lessy hago algo como

grep -v "event text" Events.log | less

Esto ahora trae una serie de otros eventos comunes y poco interesantes que también me gustaría filtrar. ¿Hay una manera que puede grep -v dentro de less? En lugar de tener que hacer

egrep -v "event text|something else|the other thing|foo|bar" Events.log | less

Me parece una característica útil al mirar cualquier tipo de archivo de registro, y si lessno es la herramienta, ¿hay otra con las cualidades que busco? Solo un lessvisor con estilo incorporado grep.

forquare
fuente

Respuestas:

91

lesstiene una coincidencia de patrones muy poderosa. Desde la página del manual :

&pattern

    Mostrar solo líneas que coincidan con pattern; las líneas que no coinciden pattern no se muestran. Si patternestá vacío (si escribe &inmediatamente seguido de ENTER), cualquier filtro se desactiva y se muestran todas las líneas. Mientras el filtrado está en vigor, se muestra un signo al comienzo del mensaje, como un recordatorio de que algunas líneas del archivo pueden estar ocultas.

    Ciertos caracteres son especiales como en el /comando :

    ^N o !

      Mostrar solo líneas que NO coinciden con pattern.
    ^R
      No interprete metacaracteres de expresiones regulares; es decir, haga una comparación textual simple.

    ____________
    Ciertos caracteres son especiales si se ingresan al comienzo de pattern; modifican el tipo de búsqueda en lugar de formar parte de la pattern.

   (Por supuesto, ^Ny ^Rrepresentan Ctrl+ N y Ctrl+ R, respectivamente). 

Entonces, por ejemplo, &dnsmostrará solo las líneas que coinciden con el patrón dnsy &!dnsfiltrará (excluirá) esas líneas, mostrando solo las líneas que no coinciden con el patrón.

En la descripción del /comando se observa que

    La patternes una expresión regular, tal como lo reconoce la biblioteca de expresiones regulares que proporciona su sistema.

Entonces

  • &eth[01]  mostrará líneas que contengan eth0oeth1
  • &arp.*eth0mostrará líneas que contienen arpseguido deeth0
  • &arp|dns  mostrará líneas que contengan arpodns

Y !puede invertir cualquiera de los anteriores. Entonces, el comando que desea utilizar para el ejemplo en su pregunta es:

&!event text|something else|the other thing|foo|bar

También use y para buscar (y / para ir al siguiente / anterior)./pattern?patternnN

Orión
fuente
1
¡Esto casi está ahí! En less, el uso de '&! <1stpattern>' me permite 'ocultar' líneas con un patrón, sin embargo, solo se aplica a un patrón a la vez, por lo que si encuentro un segundo patrón y aplico '&! <2ndpattern>', las líneas que coincidían con el primer patrón y estaban ocultas, ahora son visibles. ¡Muy cerca!
forquare
@forquare: hay un historial de comandos al que puede acceder con las teclas de flechas arriba y abajo. Entonces presione &!y luego presione una tecla de flecha.
PM 2 Timbre
@forquare: Y acabo de descubrir que el historial está guardado, por lo que sus patrones antiguos estarán disponibles la próxima vez que ejecute less; Sin embargo, no sé si se conserva después del reinicio.
PM 2 Timbre
1
@orion que fue lo último que me faltaba: cómo concatenar patrones juntos. Pensé que había probado el símbolo de la tubería antes y falló, pero ahora lo intento de nuevo, ¡funciona! Entonces: &! <pattern1> | <pattern2> | <pattern3> eliminará las líneas con pattern1 o pattern2 o pattern3
forquare
1
Me lo imaginé. Homebrew dupes tiene la última versión. Solo tuve que patear bash porque no estaba agarrando el archivo correcto (aunque eso me dijo que estaba agarrando / user / local / bin / less).
spinlock
7

Sobre la base de la respuesta de Orión , la less(1)página del manual describe

/pattern

    Busque hacia adelante en el archivo la N -ésima línea que contiene el pattern.  El valor  predeterminado de N es 1. patternEs una expresión regular, tal como lo reconoce la biblioteca de expresiones regulares suministrada por su sistema. La búsqueda comienza en la segunda línea que se muestra (pero vea las opciones -ay -j, que cambian esto).

    Ciertos caracteres son especiales si se ingresan al comienzo de pattern; Modifican el tipo de búsqueda en lugar de formar parte de pattern:

    ^N o !

      Busque líneas que NO coincidan con pattern.
    ^E o *
      Busca en múltiples archivos. Es decir, si la búsqueda llega al FIN del archivo actual sin encontrar una coincidencia, la búsqueda continúa en el siguiente archivo en la lista de la línea de comandos.
    ^F o @
      Comience la búsqueda en la primera línea del PRIMER archivo en la lista de la línea de comandos, independientemente de lo que se muestre actualmente en la pantalla o la configuración de las opciones -au -j.
    ^K
      Resalte cualquier texto que coincida con el patternde la pantalla actual, pero no se mueva a la primera coincidencia (MANTENER la posición actual).
    ^R
      No interprete metacaracteres de expresiones regulares; es decir, haga una comparación textual simple.

    ____________
    † Los comandos pueden estar precedidos por un número decimal, llamado N en las descripciones ...

   (Por supuesto , ^Ny ^E, etc., representan Ctrl+ Ny Ctrl+ E, etc.) 

Resulta que y funcionan bien juntos. Por ejemplo, los comandos&pattern/pattern

  • &!arp|dnsEnter
  • /Ctrl+Kfail|fatal|fault|sd[a-z][0-9]Enter

escrito en cualquier orden, ocultará (excluir) todas las líneas que contienen arpo dns(como grep -v), y luego, en el resto de líneas, ponen de manifiesto todas las apariciones de fail, fatal, fault, o cualquier cosa que se ve como el nombre de un dispositivo SCSI ( sd[a-z][0-9]). Tenga en cuenta que las líneas que contienen arpo dns, y también failo cualquiera de las otras palabras de peligro, no se mostrarán.

G-Man dice 'restablecer a Monica'
fuente
2

En los últimos meses, me he enamorado un poco fzf.

En su caso, siempre y cuando no se necesita contexto (es decir, el equivalente a grep -A, -Bo -Cno es necesario, y por cierto, a menos que está &también tiene la misma limitación), entonces fzf es una herramienta muy poderosa.

Aquí hay un ejemplo tonto:

printf "%s\n" {aa,bb,cc}{dd,ee,ff}{gg,hh,ii} | fzf

Si ejecuta eso y juega con entradas como, aa | bb dd | ee !gg !hhetc., verá rápidamente lo que está sucediendo.

La documentación de Fzf sobre el |operador es escasa, pero mi mejor suposición es que solo se aplica a los términos inmediatamente antes y después, lo que significa, en efecto, que OR tiene prioridad sobre AND (que está implícito ; todos los términos son AND-ed por defecto) . Pero en la mayoría de los casos esto no debería ser un problema, y ​​las cosas funcionan bien en mi experiencia.

Dale un tiro. Lo he encontrado sorprendentemente útil cuando se trata de buscar cosas cuando no estoy realmente seguro de lo que estoy buscando y cuando el contexto no importa.

sitaram
fuente