Исключить файлы с очень длинными строками текста из вывода 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строк все еще остается .


2

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

grep -Po '.{0,30}pattern.{0,30}' *.js
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.