Excluir archivos que tienen líneas de texto muy largas de la salida grep

18

A menudo ejecuto comandos grep para encontrar cosas en mi código, pero el problema con los proyectos web es que a menudo habrá archivos comprimidos de JavaScript y CSS que crean una gran línea de texto, de modo que si se encuentra una coincidencia, la ventana de terminal completa es lleno por más de 1000 líneas, por lo que es extremadamente poco práctico encontrar lo que estoy buscando.

Entonces, ¿hay alguna manera de evitar archivos que tengan líneas de texto de más de 200 caracteres?

Mark Cameron
fuente

Respuestas:

20

Con GNU grep y xargs:

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

Alternativamente, podría cortar la salida de grep:

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

o dígale a su terminal que no ajuste el texto si lo admite:

tput rmam
grep -r pattern .

o usar less -S

grep -r pattern . | less -S
Stéphane Chazelas
fuente
3
Usando regex de su primer ejemplo, entubado en grep con invertido ... | grep -v -E '.{200}', también funciona. Por ejemplo, para encontrar todas las líneas de archivos * .js en el directorio actual con ".name" en ellas que no tengan más de 200 caracteres: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver
3

Opción 1: puede excluir archivos que coincidan con un patrón determinado:

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

Esto excluirá script.min.jsy style.min.css... Otra grepopción incluye --exclude-from=FILEy--exclude-dir=DIR

Opción 2: no estoy seguro de si esto es práctico, pero puede hacer cutlos primeros 200 caracteres de cada línea y luego grep:

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

El primero grephace una coincidencia inicial y genera el nombre del archivo y la línea, el segundo asegura PATTERNque todavía está allí después de cutajustar las líneas.

aularon
fuente
2

En este tipo de situación, me gusta grep un patrón con un contexto de vecindario (digamos 30 caracteres):

grep -Po '.{0,30}pattern.{0,30}' *.js
JJoao
fuente