Escludere file con righe di testo molto lunghe dall'output di grep


18

Eseguo spesso i comandi grep per trovare elementi nel mio codice, ma il problema con i progetti Web è che spesso ci saranno file JavaScript e CSS compressi che creano un'enorme riga di testo, in modo che se viene trovata una corrispondenza, l'intera finestra del terminale è riempito per più di 1000 linee, rendendo estremamente poco pratico trovare quello che sto cercando.

Quindi c'è un modo per evitare i file che dicono singole righe di testo di oltre 200 caratteri?

Risposte:


20

Con GNU grep e xargs:

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

In alternativa, potresti tagliare l'output di grep:

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

o dì al tuo terminale di non avvolgere il testo se lo supporta:

tput rmam
grep -r pattern .

o usare less -S

grep -r pattern . | less -S

3
Usando regex dal tuo primo esempio, anche il piping in grep con invert match ... | grep -v -E '.{200}', funziona. Ad esempio, per trovare tutte le righe di file * .js nella directory corrente con ".name" in esse non più lunghe di 200 caratteri: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver,

3

Opzione 1: è possibile escludere file corrispondenti a un determinato modello:

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

Ciò escluderà script.min.jse style.min.css... Altre grepopzioni includono --exclude-from=FILEe--exclude-dir=DIR

Opzione 2: non sono sicuro che sia pratico, ma puoi usare cuti primi 200 caratteri di ogni riga e poi grep:

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

Il primo grepfa una corrispondenza iniziale e genera il nome del file e la linea, il secondo assicura che PATTERNsia ancora lì dopo aver cuttinto le linee.


2

In questo tipo di situazione, mi piace grep uno schema con un contesto di quartiere (diciamo 30 caratteri):

grep -Po '.{0,30}pattern.{0,30}' *.js
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.