Exibir arquivos sem linhas com determinada string


12

Procurando por um programa como tailou lessque permita visualizar meus logs sem linhas que contenham uma determinada string. Por exemplo, veja meu syslog sem as [UFW BLOCK]linhas de entrada UFW ( ).


Embora não seja fácil fornecer uma solução para a descrição exata do problema com esse recurso, talvez você esteja interessado em saber que lessoferece a possibilidade de filtrar as linhas exibidas após um padrão de expressão regular. Você pode usar esse recurso digitando &seguido pelo padrão e revertê-lo digitando &sozinho.
Aaron

Respostas:


13

A opção de inversão de correspondência de padrão -vpara grepé realmente útil para isso:

grep -v 'UFW BLOCK' /var/log/syslog

Isso mostrará todas as linhas que não contêm UFW BLOCK. Como grepusa expressões regulares básicas por padrão, a inclusão dos colchetes fará com que procure qualquer um dos caracteres individuais de 'UFW BLOCK', incluindo o espaço. Você provavelmente acabará sem saída. Se você precisar garantir que haja colchetes ao redor da string, escape-os \[UFW BLOCK\]ou use a -Fopção de grepincluir apenas strings fixas (obrigado a Zanna e Steeldriver pelos conselhos sobre isso):

grep -Fv '[UFW BLOCK]' /var/log/syslog

Você pode facilitar a visualização, canalizando a saída para um pager como less:

grep -v 'UFW BLOCK' /var/log/syslog | less

Ou redirecione a saída para um arquivo no diretório inicial para visualização posterior:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog

2
Você também pode usar o fgrepcomando que é equivalente a grep -F.
Tulains Córdova

2
O homem do @ TulainsCórdova grep diz que "A chamada direta como egrep ou fgrep está obsoleta, mas é fornecida para permitir que aplicativos históricos que dependem deles sejam executados sem modificação". Eu não sei se eles nunca vão agir sobre esta depreciação, mas acho que usando esses comandos não é a melhor prática
Aaron

5

Você também pode usar sedo dcomando 's para excluir as linhas com o padrão do fluxo:

sed '/\[UFW BLOCK\]/d' /var/log/syslog

Nós escapamos []como normalmente eles denotam uma classe de personagem, significando "combinar qualquer coisa aqui dentro"


5

Você pode usar qualquer ferramenta com recursos de edição. Você já recebeu soluções usando grepe sed, aqui estão algumas outras opções. Tudo isso pode ser facilmente canalizado para lessou moreou qualquer outra coisa.

  1. Perl

    perl -ne 'print unless /\[UFW BLOCK\]/' /var/log/syslog
    

    Como este é Perl, TIMTOWDI! .

    perl -pe '$_="" if /\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ || print' /var/log/syslog
    perl -ne 'print if !/\[UFW BLOCK\]/' /var/log/syslog
    perl -ne '!/\[UFW BLOCK\]/ && print' /var/log/syslog
    perl -ne '/\[UFW BLOCK\]/ ? "" : print' /var/log/syslog
    
  2. awk

    awk '!/\[UFW BLOCK\]/' file
    

2

Você também pode usar awk:

awk '!/PATTERN/' log

Uso quando tenho mais de um "padrão" e não quero usar dois grepcomo:

... | grep -v foo | grep -v bar

qual a sintaxe é:

awk '!/PATTERN/ && !/PATTERN2/' log

"Eu uso quando tenho mais de um" padrão "e não quero usar dois grep como" ------ grep -Ev "foo|bar"?
αғsнιη

Você também pode usar -epara definir vários padrões. grep -v -e 'foo' -e 'bar'
Arronical

@AFSHIN (Não sei como meu comentário são removidos), eu quis dizer para uma lógica e não ou;)
Ravexina

1

Com lessa &opção de comando , é possível filtrar para exibir apenas o padrão correspondente desejado, como abaixo,

& /PATTERN/

no seu caso, se você deseja que as linhas de filtro UFW BLOCKnão sejam exibidas na saída, basta usar &!o seguinte:

&! /UFW BLOCK/
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.