Исключить файлы с очень длинными строками текста из вывода grep

18

Я часто запускаю команды grep, чтобы найти что-то в моем коде, но проблема с веб-проектами заключается в том, что часто будут сжатые файлы JavaScript и CSS, которые создают одну огромную строку текста, так что, если совпадение найдено, все окно терминала будет заполнены более чем на 1000 строк, что делает крайне непрактичным поиск того, что я ищу.

Так есть ли способ избежать файлов, которые говорят, что отдельные строки текста более 200 символов?

Марк Кэмерон
источник

Ответы:

20

С GNU grep и xargs:

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

Кроме того, вы можете сократить вывод grep:

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

или попросите терминал не переносить текст, если он его поддерживает:

tput rmam
grep -r pattern .

или использовать less -S

grep -r pattern . | less -S
Стефан Шазелас
источник
3
Использование регулярных выражений из вашего первого примера, передача в grep с обратным соответствием ... | grep -v -E '.{200}', тоже работает. Например, чтобы найти все строки файлов * .js в текущем каталоге с «.name» в них, которые не длиннее 200 символов: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Гари С. Уивер
3

Вариант 1. Вы можете исключить файлы, соответствующие определенному шаблону:

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

Это исключит script.min.jsи style.min.css... Другой grepвариант включает --exclude-from=FILEи--exclude-dir=DIR

Вариант 2: я не уверен, насколько это практично, но вы можете cutиспользовать первые 200 символов в каждой строке, а затем grepих:

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

Первый grepвыполняет начальное сопоставление и выводит имя файла и строку, второй гарантирует, PATTERNчто после cutстрок все еще остается .

aularon
источник
2

В такой ситуации мне нравится использовать шаблон с контекстом соседства (скажем, 30 символов):

grep -Po '.{0,30}pattern.{0,30}' *.js
JJoao
источник