web-dev-qa-db-fra.com

grep dedans moins?

Je passe actuellement en revue de nombreux journaux inconnus à la recherche de certains problèmes. Le premier fichier que je regarde est Events.log, et j'obtiens au moins trois pages dans less qui 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 less et fais quelque chose comme

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

Cela apporte maintenant un certain nombre d'autres événements communs et inintéressants que j'aimerais également filtrer. Existe-t-il un moyen pour moi grep -và l'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 je regarde n'importe quel type de fichier journal - et si less n'est pas l'outil, y en a-t-il un autre avec les qualités que je recherche? Juste un visualiseur de style less avec grep intégré.

63
forquare

less a une correspondance de motifs très puissante. Depuis la page de manuel :

&pattern

    Afficher uniquement les lignes qui correspondent à pattern; lignes qui ne correspondent pas au patternn'est pas affiché. Si patternest vide (si vous tapez &immédiatement suivi de ENTER), tout filtrage est désactivé et toutes les lignes s'affichent. Pendant le filtrage, une esperluette s'affiche 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 le / commande:

    ^N ou !

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

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

(Bien sûr ^N et ^R représenter Ctrl+N et Ctrl+R, respectivement.)

Ainsi, par exemple, &dns n'affichera que les lignes correspondant au modèle dns et &!dns filtrera (exclura) ces lignes, affichant uniquement les lignes qui ne correspondent pas au modèle.

Il est noté dans la description du / commande qui

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

Donc

  • &eth[01] Affichera les lignes contenant eth0 ou eth1
  • &arp.*eth0 affichera les lignes contenant arp suivies de eth0
  • &arp|dns Affichera les lignes contenant arp ou dns

Et le ! peut inverser l'un des éléments ci-dessus. Ainsi, la commande que vous souhaitez utiliser pour l'exemple de votre question est:

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

Utiliser aussi /pattern et ?pattern pour rechercher (et n/N pour passer au suivant/précédent).

101
orion

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

/pattern

    Recherchez dans le fichier le N-th ligne contenant le patternNpar défaut à 1. Le pattern est 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 voyez le -aet -joptions, qui changent cela).

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

    ^N ou !

      Recherchez les lignes qui ne correspondent PAS au pattern.
    ^Eou *
      Recherchez plusieurs fichiers. Autrement dit, si la recherche atteint la FIN du fichier actuel sans trouver de correspondance, la recherche se poursuit dans le fichier suivant de la liste de ligne de commande.
    ^Fou @
      Commencez la recherche sur la première ligne du PREMIER fichier dans la liste des lignes de commande, quels que soient les éléments actuellement affichés à l'écran ou les paramètres de -aou -joptions.
    ^K
      Mettez en surbrillance tout texte qui correspond à patternsur l'écran actuel, mais ne passez pas à la première correspondance (GARDER la position actuelle).
    ^R
      N'interprétez pas les métacaractères d'expression régulière; c'est-à-dire, faites une comparaison textuelle simple.

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

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

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

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

tapé dans l'un ou l'autre ordre, masquera (exclura) toutes les lignes contenant arp ou dns (comme grep -v), puis, dans les lignes restantes, mettez en surbrillance toutes les occurrences de fail, fatal, fault, ou tout ce qui ressemble au nom d'un périphérique SCSI (sd[a-z][0-9]). Notez que les lignes qui contiennent arp ou dns, ainsi que fail ou l'un des autres mots de danger, pas s'affiche.

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

Dans votre cas, tant que le contexte n'est pas nécessaire (c'est-à-dire l'équivalent de grep's -A, -B, ou -C n'est pas nécessaire, et en passant, moins de & a également la même limitation), alors fzf est 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 !hh et ainsi de suite, vous verrez rapidement ce qui se passe.

Documentation de Fzf sur le | L'opérateur est rare, mais ma meilleure supposition est qu'il ne s'applique qu'aux termes immédiatement avant et après, ce qui signifie, en effet, que OR a priorité sur AND (qui est implicite; tous les termes sont ET-ed par défaut. Mais dans la plupart des cas, cela ne devrait pas être un problème, et les choses fonctionnent bien selon mon expérience.

Donner un coup de feu. Je l'ai trouvé étonnamment utile quand il s'agit de parcourir des choses quand je ne suis pas vraiment sûr de ce que je recherche et quand le contexte n'a pas d'importance.

2
sitaram