unix - примеры - grep-v example




Использовать grep--exclude/- включить синтаксис, чтобы не grep через определенные файлы (15)

В каталогах также много двоичных файлов. Я не могу искать только определенные каталоги (структура каталогов - большой беспорядок). Есть ли лучший способ grepping только в определенных файлах?

ripgrep

Это один из самых быстрых инструментов, предназначенных для рекурсивного поиска в вашем текущем каталоге. Он написан в Rust , построенном на основе регулярного двигателя Rust's для максимальной эффективности. Проверьте подробный анализ здесь .

Таким образом, вы можете просто запустить:

rg "some_pattern"

Он уважает ваш .gitignore и автоматически пропускает скрытые файлы / каталоги и двоичные файлы.

Вы все равно можете настроить включение или исключение файлов и каталогов с помощью -g / --glob . Правила глобирования соответствуют .gitignore globs. Проверьте man rg на помощь.

Дополнительные примеры см. В разделе: Как исключить некоторые файлы, не соответствующие определенным расширениям с помощью grep?

На macOS вы можете установить через brew install ripgrep .

Я ищу строку foo= в текстовых файлах в дереве каталогов. Это на общей машине Linux, у меня есть оболочка bash:

grep -ircl "foo=" *

В каталогах также много бинарных файлов, которые соответствуют «foo =». Поскольку эти результаты не актуальны и замедляют поиск, я хочу, чтобы grep не просматривал эти файлы (в основном изображения JPEG и PNG). Как мне это сделать?

Я знаю, что есть опции --exclude=PATTERN и --include=PATTERN , но каков формат шаблона? Страница man grep гласит:

--include=PATTERN     Recurse in directories only searching file matching PATTERN.
--exclude=PATTERN     Recurse in directories skip file matching PATTERN.

Поиск в grep include , grep include exclude , grep exclude и варианты не нашли ничего соответствующего

Если есть лучший способ grepping только в определенных файлах, я все для этого; перемещение файлов-нарушителей не является вариантом. Я не могу искать только определенные каталоги (структура каталогов - большой беспорядок, со всем везде). Кроме того, я ничего не могу установить, поэтому мне приходится делать общие инструменты (например, grep или предлагаемая находка ).


git grep

Используйте git grep который оптимизирован для производительности и нацелен на поиск определенных файлов.

По умолчанию он игнорирует двоичные файлы, и он .gitignore ваш .gitignore . Если вы не работаете с структурой Git, вы все равно можете использовать ее, передав --no-index .

Пример синтаксиса:

git grep --no-index "some_pattern"

Дополнительные примеры см. В следующих разделах:

  • Как исключить определенные каталоги / файлы из поиска git grep .
  • Проверьте, существует ли в файле все несколько строк или регулярных выражений

В grep 2.5.1 вы должны добавить эту строку в профиль ~ / .bashrc или ~ / .bash

export GREP_OPTIONS="--exclude=\*.svn\*"

Если вы ищете нерекурсивно, вы можете использовать шаблоны glop для соответствия именам файлов.

grep "foo" *.{html,txt}

включает html и txt. Он выполняет поиск только в текущем каталоге.

Поиск в подкаталогах:

   grep "foo" */*.{html,txt}

В подкаталогах:

   grep "foo" */*/*.{html,txt}

Если вы просто хотите пропустить двоичные файлы, я предлагаю вам посмотреть вариант -I (верхний регистр i). Он игнорирует двоичные файлы. Я регулярно использую следующую команду:

grep -rI --exclude-dir="\.svn" "pattern" *

Он ищет рекурсивно, игнорирует двоичные файлы и не просматривает скрытые папки Subversion для любого шаблона, который я хочу. У меня есть псевдоним «grepsvn» на моем ящике на работе.


Используйте синтаксис globing оболочки:

grep pattern -r --include=\*.{cpp,h} rootdir

Синтаксис для --exclude идентичен.

Обратите внимание, что звездочка экранирована с обратной косой чертой, чтобы предотвратить ее расширение оболочкой (цитирование ее, например, --include="*.{cpp,h}" , будет работать так же хорошо). В противном случае, если бы у вас были файлы в текущем рабочем каталоге, которые соответствовали шаблону, командная строка расширилась бы до чего-то типа grep pattern -r --include=foo.cpp --include=bar.h rootdir , который бы только просматривал файлы с именем foo.cpp и bar.h , что, скорее всего, не то, что вы хотели.


Параметр --binary-files=without-match GNU grep позволяет пропускать двоичные файлы. (Эквивалент переключателя -I упомянутого в другом месте.)

(Для этого может потребоваться последняя версия grep ; по крайней мере 2.5.3 имеет ее.)


Пожалуйста, взгляните на ack , который предназначен именно для этих ситуаций. Ваш пример

grep -ircl --exclude=*.{png,jpg} "foo=" *

выполняется с помощью ack as

ack -icl "foo="

потому что ack никогда не выглядит в двоичных файлах по умолчанию, а -r по умолчанию. И если вы хотите только файлы CPP и H, просто выполните

ack -icl --cpp "foo="


Посмотри @ этот.

grep --exclude="*\.svn*" -rn "foo=" * | grep -v Binary | grep -v tags

Чтобы игнорировать все двоичные результаты grep

grep -Ri "pattern" * | awk '{if($1 != "Binary") print $0}'

Часть awk будет отфильтровывать все строки ссылок на двоичный файл foo


Я дилетант, дано, но вот как выглядит мой ~ / .bash_profile:

export GREP_OPTIONS="-orl --exclude-dir=.svn --exclude-dir=.cache --color=auto" GREP_COLOR='1;32'

Обратите внимание, что для исключения двух каталогов мне пришлось дважды использовать -exclude-dir.


Я считаю, что вывод grepping grep очень полезен:

grep -rn "foo=" . | grep -v "Binary file"

Хотя это фактически не останавливает его от поиска двоичных файлов.


найти и xargs - ваши друзья. Используйте их для фильтрации списка файлов, а не grep's --exclude

Попробуйте что-нибудь вроде

find . -not -name '*.png' -o -type f -print | xargs grep -icl "foo="

эти сценарии не справляются со всей проблемой ... Попробуйте это лучше:

du -ha | grep -i -o "\./.*" | grep -v "\.svn\|another_file\|another_folder" | xargs grep -i -n "$1"

этот сценарий настолько лучше, потому что он использует «реальные» регулярные выражения, чтобы избежать поиска в каталогах. просто выделите папки или имена файлов с помощью «\ |» на grep -v

наслаждайся этим! найденный на моей оболочке Linux! XD





grep