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é.
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 aupattern
n'est pas affiché. Sipattern
est 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 dupattern
; ils modifient le type de recherche plutôt que de faire partie dupattern
.
(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
ð[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).
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
pattern
. N†par défaut à 1. Lepattern
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-a
et-j
options, 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 dupattern
:
^N
ou!
Recherchez les lignes qui ne correspondent PAS au
pattern
.^E
ou*
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.
^F
ou@
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
-a
ou-j
options.^K
Mettez en surbrillance tout texte qui correspond à
pattern
sur 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|dns
Enter/
Ctrl+Kfail|fatal|fault|sd[a-z][0-9]
Entertapé 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.