Visualizar arquivos sem linhas com determinada string

12

Procurando por um programa como tail ou less , que me permite visualizar meus registros sem linhas que contenham uma determinada string. Por exemplo, veja meu syslog sem linhas de entrada UFW ( [UFW BLOCK] ).

    
por John Gr. 27.07.2017 / 14:56

5 respostas

13

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

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

Isso mostrará todas as linhas que não contiverem UFW BLOCK . Como grep usa expressões regulares básicas por padrão, a inclusão dos colchetes fará com que ele procure por 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 opção -F de grep para incluir apenas strings fixas (graças a Zanna e Steeldriver para os conselhos sobre isto):

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

Você pode facilitar a exibição da piping da saída para um pager como less :

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

Ou redirecione a saída para um arquivo em seu diretório pessoal para visualização posterior:

grep -v 'UFW BLOCK' /var/log/syslog > ~/filtered_syslog
    
por Arronical 27.07.2017 / 14:59
5

Você também pode usar o comando sed ' d para excluir as linhas com o padrão do fluxo:

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

Nós escapamos de [] , pois normalmente eles denotam uma classe de caractere, que significa "corresponde a qualquer coisa aqui dentro"

    
por Zanna 27.07.2017 / 15:12
5

Você pode usar qualquer ferramenta com recursos de edição. Você já recebeu soluções usando grep e sed , aqui estão algumas outras opções. Todos esses podem ser facilmente canalizados para less ou more ou qualquer outra coisa.

  1. Perl

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

    Como isso é 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
    
por terdon 27.07.2017 / 15:24
2

Você também pode usar awk :

awk '!/PATTERN/' log

Eu uso quando tenho mais de um "padrão" e não quero usar dois grep como:

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

qual é a sintaxe:

awk '!/PATTERN/ && !/PATTERN2/' log
    
por Ravexina 27.07.2017 / 15:26
1

Com a opção less do comando & , é possível filtrar para exibir apenas o padrão correspondente desejado, conforme abaixo

& /PATTERN/

no seu caso, se você quiser que as linhas de filtro com UFW BLOCK não sejam exibidas na saída, basta usar &! abaixo:

&! /UFW BLOCK/
    
por αғsнιη 27.07.2017 / 17:53