web-dev-qa-db-fra.com

Afficher les fichiers sans lignes avec certaines chaînes

Rechercher un programme comme tail ou less qui me permet de consulter mes journaux sans lignes contenant une certaine chaîne. Par exemple, affichez mon journal système sans les lignes d'entrée UFW ([UFW BLOCK]).

12
John Gr.

L'option d'inversion de correspondance de modèle -v pour grepest vraiment utile pour cela:

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

Cela vous montrera toutes les lignes ne contenant pas UFW BLOCK. Comme greputilise des expressions régulières de base par défaut, l'inclusion des crochets permettra de rechercher tous les caractères individuels de 'UFW BLOCK', y compris l'espace. Vous allez probablement vous retrouver sans sortie. Si vous devez vous assurer qu'il y a des crochets autour de la chaîne, écartez-les \[UFW BLOCK\] ou utilisez l'option -F de greppour inclure uniquement les chaînes fixes (Merci à Zanna et Steeldriver pour le conseil à ce sujet):

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

Vous pouvez faciliter la visualisation en dirigeant la sortie vers un pager tel que lessname__:

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

Ou redirigez la sortie vers un fichier de votre répertoire personnel pour une consultation ultérieure:

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

Vous pouvez également utiliser la commande sed de d 's pour supprimer les lignes avec le motif du flux:

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

Nous échappons à [] car ils désignent normalement une classe de caractères, ce qui signifie "correspond à tout ce qui se trouve à l'intérieur"

5
Zanna

Vous pouvez utiliser n'importe quel outil doté de fonctionnalités d'édition. Vous avez déjà reçu des solutions utilisant grep et sed, voici quelques autres choix. Tous ces éléments peuvent facilement être redirigés vers less ou more ou toute autre chose.

  1. Perl

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

    Puisque c'est 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
    
5
terdon

Vous pouvez aussi utiliser awk:

awk '!/PATTERN/' log

Je l'utilise quand j'ai plus d'un "motif" et que je ne veux pas utiliser deux grep comme:

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

dont la syntaxe est la suivante:

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

Avec l'option & de la commande less, il est possible de filtrer pour afficher uniquement le modèle correspondant souhaité, comme indiqué ci-dessous,

& /PATTERN/

dans votre cas, si vous souhaitez que les lignes de filtrage avec UFW BLOCK ne s'affichent pas dans la sortie, vous pouvez simplement utiliser &! comme ci-dessous:

&! /UFW BLOCK/
1
αғsнιη