grep dentro de menos?


58

Atualmente, estou examinando muitos logs desconhecidos, procurando alguns problemas. O primeiro arquivo que olho é Events.log e recebo pelo menos três páginas nas lessquais parecem exibir o mesmo evento em momentos diferentes - um evento que parece ser bastante benigno. Gostaria de filtrar este evento e, atualmente, parei lesse fiz 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 puder 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 lessnão for a ferramenta, há outra com as qualidades que eu procuro? Apenas um lessvisualizador de estilo com incorporado grep.

Respostas:


91

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

&pattern

    Exibe apenas as linhas que correspondem ao pattern; as linhas que não correspondem ao pattern não são exibidas. Se patternestiver vazio (se você digitar &imediatamente seguido por ENTER), qualquer filtragem será desativada e todas as linhas serão exibidas. Enquanto a filtragem estiver em vigor, um e comercial será exibido no início do prompt, como um lembrete de que algumas linhas no arquivo podem estar ocultas.

    Certos caracteres são especiais, como no /comando :

    ^N ou !

      Exiba apenas as linhas que NÃO correspondem ao pattern.
    ^R
      Não interprete metacaracteres de expressão regular; isto é, faça uma comparação textual simples.

    ____________
    Certos caracteres são especiais se inseridos no início do pattern; eles modificam o tipo de pesquisa em vez de se tornar parte da pattern.

   (É claro ^Ne ^Rrepresenta Ctrl+ N e Ctrl+ R, respectivamente.) 

Assim, por exemplo, &dnsexibirá apenas as linhas que correspondem ao padrão dnse &!dnsfiltrará (excluirá) essas linhas, exibindo apenas as linhas que não corresponderem ao padrão.

É observado na descrição do /comando que

    A patterné uma expressão regular, conforme reconhecido pela biblioteca de expressões regulares fornecida pelo seu sistema.

assim

  • &eth[01]  exibirá linhas contendo eth0oueth1
  • &arp.*eth0exibirá linhas contendo arpseguidas deeth0
  • &arp|dns  exibirá linhas contendo arpoudns

E o !pode inverter qualquer um dos itens acima. Portanto, o comando que você deseja usar para o exemplo em sua pergunta é:

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

Também use e para pesquisar (e / para ir para o próximo / anterior)./pattern?patternnN


1
Isso está quase lá! Em less, usar '&! <1stpattern>' permite-me 'ocultar' linhas com um padrão, no entanto, isso só se aplica a um padrão de cada vez; portanto, se eu encontrar um segundo padrão e aplicar '&! <2ndpattern>', as linhas que correspondiam ao primeiro padrão e estavam ocultas agora são visíveis. Tão perto!
forquare

@forquare: existe um histórico de comandos que você pode acessar com as teclas de seta para cima e para baixo. Então, pressione &!e, em seguida, pressione uma tecla de seta.
PM 2Ring

@forquare: E acabei de descobrir que a história é salva, então seus padrões antigos estarão disponíveis na próxima vez que você executar less; Não sei se ele foi preservado após a reinicialização.
PM 2Ring

1
@orion que foi a última parte que me faltava - como concatenar padrões juntos. Embora eu já tivesse tentado o símbolo do tubo antes e ele falhou, mas agora eu tento novamente, ele funciona! Portanto: &! <padrão1> | <padrão2> | <padrão3> removerá as linhas com padrão1 ou padrão2 ou padrão3
forquare

1
Eu descobri. O Homebrew dupes tem a versão mais recente. Eu só tive que dar um chute no bash porque ele não estava pegando o arquivo certo (embora o que me dissesse que estava pegando / user / local / bin / less).
spinlock

7

Com base na resposta do orion , a less(1)página de manual descreve

/pattern

    Procure no arquivo a n- ésima linha que contém o pattern.  N assume como padrão 1. patternÉ uma expressão regular, conforme reconhecido pela biblioteca de expressões regulares fornecida pelo seu sistema. A pesquisa começa na segunda linha exibida (mas consulte as opções -ae -j, que alteram isso).

    Certos caracteres são especiais se inseridos no início do pattern; eles modificam o tipo de pesquisa em vez de se tornar parte de pattern:

    ^N ou !

      Procure por linhas que NÃO correspondam ao pattern.
    ^E ou *
      Pesquise vários arquivos. Ou seja, se a pesquisa atingir o FIM do arquivo atual sem encontrar uma correspondência, a pesquisa continuará no próximo arquivo na lista de linha de comando.
    ^F ou @
      Comece a pesquisa na primeira linha do arquivo PRIMEIRO na lista de linha de comando, independentemente do que é exibido atualmente na tela ou das configurações das opções -aou -j.
    ^K
      Destaque qualquer texto que corresponda ao patternda tela atual, mas não vá para a primeira correspondência (KEEP position atual).
    ^R
      Não interprete metacaracteres de expressão regular; isto é, faça uma comparação textual simples.

    ____________
    † Os comandos podem ser precedidos por um número decimal, chamado N nas descrições…

   (Claro ^Ne ^E, etc, representam Ctrl+ Ne Ctrl+ E, etc) 

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

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

digitado em qualquer ordem, vai esconder (excluir) todas as linhas que contêm arpou dns(como grep -v), e depois, nas restantes linhas, destacar todas as ocorrências fail, fatal, fault, ou qualquer coisa que se parece com o nome de um dispositivo SCSI ( sd[a-z][0-9]). Observe que as linhas que contêm arpou dns, e também failou qualquer outra palavra de perigo, não serão exibidas.


2

Nos últimos meses, me apaixonei um pouco fzf.

No seu caso, enquanto contexto não é necessário (ou seja, o equivalente a grep de -A, -Bou -Cnão é necessária, e pela maneira, menos de &também tem a mesma limitação), então FZF é uma ferramenta muito poderosa.

Aqui está um exemplo bobo:

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

Se você executar isso e jogar com entradas como essas, aa | bb dd | ee !gg !hhverá rapidamente o que está acontecendo.

A documentação de Fzf sobre o |operador é escassa, mas meu melhor palpite é que ela se aplica apenas aos termos imediatamente antes e depois, o que significa, com efeito, que OR tem precedência sobre AND (o que está implícito ; todos os termos são AND por padrão) . Mas na maioria dos casos, isso não deve ser um problema, e as coisas funcionam bem na minha experiência.

Experimente. Achei surpreendentemente útil quando se trata de procurar coisas quando não tenho muita certeza do que estou procurando e quando o contexto não importa.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.