Exclure des fichiers contenant de très longues lignes de texte de la sortie grep


18

J'exécute souvent des commandes grep pour trouver des choses dans mon code, mais le problème avec les projets Web est qu'il y aura souvent des fichiers JavaScript et CSS compressés qui créent une énorme ligne de texte, de sorte que si une correspondance est trouvée, toute la fenêtre du terminal est rempli pour plus de 1000 lignes, ce qui rend extrêmement difficile de trouver ce que je cherche.

Existe-t-il donc un moyen d'éviter les fichiers contenant par exemple des lignes de texte de plus de 200 caractères?

Réponses:


20

Avec GNU grep et xargs:

grep -rLZE '.{200}' . | xargs -r0 grep pattern

Alternativement, vous pouvez couper la sortie de grep:

grep -r pattern . | cut -c1-"$COLUMNS"

ou dites à votre terminal de ne pas envelopper le texte s'il le prend en charge:

tput rmam
grep -r pattern .

Ou utiliser less -S

grep -r pattern . | less -S

3
En utilisant regex de votre premier exemple, le piping dans grep avec invert match,, ... | grep -v -E '.{200}'fonctionne aussi. Par exemple, pour trouver toutes les lignes de fichiers * .js sous le répertoire actuel avec ".name" en eux qui ne dépassent pas 200 caractères: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver

3

Option 1: vous pouvez exclure les fichiers correspondant à un certain modèle:

grep --exclude='*.min.*'

Cela exclura script.min.jset style.min.css... Les autres grepoptions incluent --exclude-from=FILEet--exclude-dir=DIR

Option 2: je ne sais pas si c'est pratique, mais vous pouvez cutles 200 premiers caractères de chaque ligne, puis greples:

grep -H [OPTIONS] PATTERN [FILE...] | cut -c1-200 | grep PATTERN

Le premier grepeffectue une correspondance initiale et affiche le nom du fichier et la ligne, le second s'assure que le PATTERNest toujours là après avoir cutting les lignes.


2

Dans ce genre de situation, j'aime grep un motif avec un contexte de voisinage (disons 30 caractères):

grep -Po '.{0,30}pattern.{0,30}' *.js
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.