Как найти текст в файлах: grep -r
Найти слово listen во всех файлах папки /etc/nginx и вложенных папок:
grep -rn "listen" /etc/nginx/-r — искать во всей папке, -n — показывать номера строк. Каждая находка печатается как файл:номер строки:строка.
Частые варианты
grep -rni "error" /var/log/myapp/
grep -rl "DB_PASSWORD" ~/projects/
grep -rn --include="*.php" "mysqli_connect" /var/www/
grep -rn --exclude-dir=node_modules --exclude-dir=.git "TODO" .
grep -rnw "main" src/
grep -rnF '$_GET[' /var/www/| Ключ | Что делает |
|---|---|
-i | без учёта регистра |
-l | только имена файлов, где есть совпадение |
--include="*.php" | искать только в файлах с подходящим именем |
--exclude-dir=имя | пропустить папку (её можно указать несколько раз) |
-w | только целое слово: main не найдётся в domain |
-F | искать текст как есть, без особого смысла у ., *, [ и других знаков |
-I | пропускать двоичные файлы (программы, картинки) |
-c | сколько строк совпало в каждом файле |
Подводные камни
- Текст со знаком
$— в одинарных кавычках. В двойных кавычках оболочка подставит переменные:"$_GET["превратится в[, и поиск будет не тем. Правильно —'$_GET[', как в примере выше. - Знаки шаблона. Без
-Fточка значит «любой символ», а[начинает набор символов. Поиск192.168.1.1найдёт и192x168y1z1; с-F— только именно этот текст. Чтобы не попадался и192.168.1.10, добавьте-w. Permission denied— в системных папках часть файлов читает только root. Запустите черезsudoили спрячьте ошибки:2>/dev/null.- «binary file matches» — совпадение нашлось в двоичном файле, и grep не печатает строку, чтобы не засорить терминал. Если файл на самом деле текстовый (например, журнал с повреждённым символом), добавьте
-a. - Ссылки на папки.
-rне заходит в символические ссылки внутри папки,-R— заходит.
Если файлов очень много
Для больших проектов есть более быстрая программа ripgrep (команда rg, пакет ripgrep). Она по умолчанию ищет во всех вложенных папках и сама пропускает то, что перечислено в .gitignore:
rg -n "TODO" ~/projects/Найти не текст, а файл по имени — в справке Как найти файл по имени в Linux.