grep dentro de menos?

51

Atualmente estou analisando muitos registros desconhecidos procurando por alguns problemas. O primeiro arquivo que eu vejo é o Events.log, e eu recebo pelo menos três páginas em less que parecem exibir o mesmo evento em momentos diferentes - um evento que parece ser bastante benigno. Eu gostaria de filtrar esse evento, e atualmente eu saio do less e faço algo como

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

Isso agora traz uma série de outros eventos comuns e desinteressantes que eu também gostaria de filtrar. Existe uma maneira que eu possa grep -v dentro de less ? Em vez de ter que fazer

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

Parece-me um recurso útil quando se olha para qualquer tipo de arquivo de log - e se less não é a ferramenta, há outra com as qualidades que eu procuro? Apenas um visualizador no estilo less com grep .

    
por forquare 15.01.2015 / 12:07

2 respostas

79

less tem correspondência de padrões muito poderosa. Na página de manual :

&pattern

    Display only lines which match the pattern; lines which do not match the pattern are not displayed.  If pattern is empty (if you type & immediately followed by ENTER), any filtering is turned off, and all lines are displayed.  While filtering is in effect, an ampersand is displayed at the beginning of the prompt, as a reminder that some lines in the file may be hidden.

    Certain characters are special as in the / command:

    ^N or !

      Display only lines which do NOT match the pattern.
    ^R
      Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

    ____________
    Certain characters are special if entered at the beginning of the pattern; they modify the type of search rather than become part of the pattern.

(É claro que ^N e ^R representam Ctrl + N e Ctrl + R , respectivamente.)

Portanto, por exemplo, &dns exibirá apenas as linhas que correspondem ao padrão dns , e &!dns filtrará (excluirá) essas linhas, exibindo apenas linhas que não correspondem ao padrão.

É indicado na descrição do comando / que

    The pattern is a regular expression, as recognized by the regular expression library supplied by your system.

Então

  • &eth[01] exibirá linhas contendo eth0 ou eth1
  • &arp.*eth0 exibirá linhas contendo arp seguido por eth0
  • &arp|dns exibirá linhas contendo arp ou dns

E o ! pode inverter qualquer um dos itens acima. Então o comando que você gostaria de usar para o exemplo em sua pergunta é:

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

Use também /pattern e ?pattern para pesquisar (e n / N para ir para o próximo / anterior).

    
por 15.01.2015 / 12:13
6

Com base na resposta da orion , a less(1) man descreve

/pattern

    Search forward in the file for the N-th line containing the pattern.  N defaults to 1.  The pattern is a regular expression, as recognized by the regular expression library supplied by your system.  The search starts at the second line displayed (but see the -a and -j options, which change this).

    Certain characters are special if entered at the beginning of the pattern; they modify the type of search rather than become part of the pattern:

    ^N or !

      Search for lines which do NOT match the pattern.
    ^E or *
      Search multiple files.  That is, if the search reaches the END of the current file without finding a match, the search continues in the next file in the command line list.
    ^F or @
      Begin the search at the first line of the FIRST file in the command line list, regardless of what is currently displayed on the screen or the settings of the -a or -j options.
    ^K
      Highlight any text which matches the pattern on the current screen, but don't move to the first match (KEEP current position).
    ^R
      Don't interpret regular expression metacharacters; that is, do a simple textual comparison.

    ____________
    Commands may be preceded by a decimal number, called N in the descriptions …

(É claro que ^N e ^E , etc., representam Ctrl + N e Ctrl + E , etc.)

Acontece que &pattern e /pattern funcionam bem juntos. Por exemplo, os comandos

  • &!arp|dns Enter
  • / Ctrl + K fail|fatal|fault|sd[a-z][0-9] Digite

digitado em qualquer ordem, ocultará (excluirá) todas as linhas contendo arp ou dns (como grep -v ) e, em seguida, nas linhas restantes, realce todas as ocorrências de fail , fatal , fault , ou qualquer coisa que se pareça com o nome de um dispositivo SCSI ( sd[a-z][0-9] ). Observe que as linhas que contêm arp ou dns , e também fail ou qualquer uma das outras palavras de perigo, não será exibido.

    
por 02.09.2015 / 00:15