grep dedans moins?


58

Je suis en train de parcourir de nombreux journaux inconnus à la recherche de problèmes. Le premier fichier que je regarde est Events.log, et je reçois au moins trois pages dans lesslesquelles semblent afficher le même événement à des moments différents - un événement qui semble être assez bénin. Je voudrais filtrer cet événement, et actuellement je quitte lesset fais quelque chose comme

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

Cela apporte maintenant un certain nombre d’événements courants, sans intérêt que je voudrais également filtrer. Est - il possible que je peux à l' grep -v intérieur de less? Plutôt que d'avoir à faire

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

Cela me semble être une fonctionnalité utile lorsque l’on regarde un fichier journal - et si ce lessn’est pas l’outil, en existe-t-il un autre qui possède les qualités que je recherche? Juste une lessvisionneuse de style avec construit en grep.

Réponses:


91

lessa correspondance de motif très puissant. De la page de manuel :

&pattern

    Afficher uniquement les lignes qui correspondent à la pattern; les lignes qui ne correspondent pas à ne pattern sont pas affichées. Si patternest vide (si vous tapez &immédiatement suivi de ENTER), tout filtrage est désactivé et toutes les lignes sont affichées. Lorsque le filtrage est activé, une esperluette est affichée au début de l'invite pour rappeler que certaines lignes du fichier peuvent être masquées.

    Certains caractères sont spéciaux comme dans la /commande :

    ^N ou !

      Afficher uniquement les lignes qui ne correspondent pas à la pattern.
    ^R
      Ne pas interpréter les métacaractères d'expression régulière; c'est-à-dire, faites une simple comparaison textuelle.

    ____________
    Certains caractères sont spéciaux s'ils sont entrés au début de la patternchaîne; ils modifient le type de recherche plutôt que de faire partie de la pattern.

   (Bien sûr ^Net ^Rreprésentent Ctrl+ N et Ctrl+ R, respectivement.) 

Ainsi, par exemple, &dnsaffichera uniquement les lignes correspondant au modèle dnset &!dnsfiltrera (exclura) ces lignes, en affichant uniquement les lignes qui ne correspondent pas au modèle.

Il est noté dans la description de la /commande que

    Le patternest une expression régulière, telle que reconnue par la bibliothèque d'expressions régulières fournie par votre système.

Alors

  • &eth[01]  affichera des lignes contenant eth0oueth1
  • &arp.*eth0affichera les lignes contenant arpsuivi deeth0
  • &arp|dns  affichera des lignes contenant arpoudns

Et le !peut inverser tout ce qui précède. La commande que vous souhaitez utiliser pour l'exemple de votre question est donc:

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

Également utiliser et pour rechercher (et / pour aller à suivant / précédent)./pattern?patternnN


1
C'est presque là! Dans ' less, utiliser' &! <1stpattern> 'me permet de' masquer 'les lignes avec un motif, mais cela ne s'applique qu'à un motif à la fois, donc si je trouve un second motif et applique' &! <2ndpattern> ', les lignes correspondant au premier motif et masquées sont maintenant visibles. Tellement proche!
forquare

@forquare: Il existe un historique des commandes auquel vous pouvez accéder avec les touches fléchées haut et bas. Alors appuyez sur &!puis appuyez sur une touche fléchée.
PM le 2

@forquare: Et je viens de découvrir que l'historique est sauvegardé. Vos anciens modèles seront donc disponibles lors de votre prochain lancement less. Je ne sais pas si c'est conservé après le redémarrage, cependant.
PM 2, le

1
@orion, c'était le dernier élément qui me manquait - comment concaténer des motifs ensemble. Je pensais avoir déjà essayé le symbole de pipe avant et cela a échoué, mais maintenant j'essaie à nouveau, ça marche! Donc: &! <Pattern1> | <pattern2> | <pattern3> supprimera les lignes avec pattern1 ou pattern2 ou pattern3
forquare le

1
Je l'ai compris. Dupes Homebrew a la dernière version. J'ai juste eu à lancer bash parce qu'il ne récupérait pas le bon fichier (même si cela m'avait dit qu'il s'agissait de / user / local / bin / less).
spinlock

7

S'appuyant sur la réponse d'Orion , la less(1)page de manuel décrit

/pattern

    Recherchez dans le fichier la N- ième ligne contenant le pattern.  N † par défaut est 1. Il patterns'agit d'une expression régulière, telle que reconnue par la bibliothèque d'expressions régulières fournie par votre système. La recherche commence à la deuxième ligne affichée (mais voir les -aet -joptions, changer cela).

    Certains caractères sont spéciaux s'ils sont entrés au début de la pattern; ils modifient le type de recherche plutôt que de faire partie du pattern:

    ^N ou !

      Rechercher des lignes qui ne correspondent pas à la pattern.
    ^E ou *
      Rechercher plusieurs fichiers. Ainsi, si la recherche atteint la FIN du fichier en cours sans trouver de correspondance, la recherche se poursuit dans le fichier suivant dans la liste de lignes de commande.
    ^F ou @
      Commencez la recherche à la première ligne du fichier FIRST dans la liste des lignes de commande, quels que soient les éléments affichés à l'écran ou les paramètres des options -aou -j.
    ^K
      Mettez en surbrillance tout texte correspondant patternà l'écran en cours, mais ne vous déplacez pas vers la première correspondance (GARDER la position actuelle).
    ^R
      Ne pas interpréter les métacaractères d'expression régulière; c'est-à-dire, faites une simple comparaison textuelle.

    ____________
    † Les commandes peuvent être précédées d'un nombre décimal, appelé N dans les descriptions…

   (Bien sûr ^Net ^E, etc., représentent Ctrl+ Net Ctrl+ E, etc.) 

Il se trouve que et bien ensemble. Par exemple, les commandes&pattern/pattern

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

tapé dans un ordre quelconque, cachera (exclure) toutes les lignes contenant arpou dns(comme grep -v), puis, dans les lignes restantes, mettent en évidence toutes les occurrences fail, fatal, faultou tout ce qui ressemble au nom d'un périphérique SCSI ( sd[a-z][0-9]). Notez que les lignes contenant arpou dns, ainsi que failtous les autres mots de danger, ne seront pas affichées.


2

Au cours des derniers mois, je suis devenu un peu amoureux fzf.

Dans votre cas, aussi longtemps que le contexte n'est pas nécessaire (soit l'équivalent de ce grep -A, -Bou -Cn'est pas nécessaire, et par la manière, moins &s'a aussi la même limitation), puis est FZF un outil très puissant.

Voici un exemple stupide:

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

Si vous exécutez cela et jouez avec des entrées comme aa | bb dd | ee !gg !hhcelle-ci, vous verrez rapidement ce qui se passe.

La documentation de Fzf sur l' |opérateur est rare, mais je suppose que cela ne s'applique qu'aux termes immédiatement avant et après, ce qui signifie en fait que OR a priorité sur AND (ce qui est implicite ; tous les termes sont AND-ed par défaut). . Mais dans la plupart des cas, cela ne devrait pas être un problème, et les choses se passent bien dans mon expérience.

Donner un coup de feu. Je l'ai trouvé étonnamment utile pour naviguer lorsque je ne suis pas vraiment sûr de ce que je cherche et que le contexte n'a pas d'importance.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.