Как найти файлы с определенным содержимым в Unix
Метки: shell | команды Linux
Понедельник, 22 сентября 2008 г.
Просмотров: 37301
Подписаться на комментарии по RSS
Вопрос. Я написал большое количество кода на C для своей работы и сохранил его как исходный код в /home/user/c/*.c и *.h. Как я могу найти файл, в содержимом которого есть определенные строки или слова (к примеру названия функций или вызов main()), используя Unix шелл?
Ответ. Вам необходимо использовать следующие команды:
[a] команда grep : выводит список строк, содержащих нужный шаблон.
[b] команда find : ищет файлы в иерархии директорий.
Используем команду grep для поиска файлов по содержимому
Введите следующие команды:
<span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> <span style="color: rgb(255, 0, 0);">'string'</span> *.txt <span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> <span style="color: rgb(255, 0, 0);">'main('</span> *.c <span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> <span style="color: rgb(255, 0, 0);">'#include<example.h>'</span> *.c <span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> <span style="color: rgb(255, 0, 0);">'getChar*'</span> *.c <span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> -i <span style="color: rgb(255, 0, 0);">'ultra'</span> *.conf <span style="color: rgb(194, 12, 185); font-weight: bold;">grep</span> -iR <span style="color: rgb(255, 0, 0);">'ultra'</span> *.conf
где
- -i : Игнорирует регистр букв и в шаблоне (верными будут строки valid, VALID, ValID) и названиях файлов поиска (к примеру file.c
- -R : Проверяет все файлы в каждой вложенной директории, рекурсивно.
FILE.c FILE.C).
Подсвечиваем найденные шаблоны
Вы можете легко подсветить найденные вхождения шаблона:
$ grep --color=auto -iR 'getChar();' *.c
Выводим имена файлов и номера строк, где найден шаблон.
Также может оказаться полезным отображать имя файла и номер строки с найденным шаблоном.
$ grep --color=auto -iRnH 'getChar();' *.c
Где,
- -n : Номер строки, в которой содержиться нужный шаблон поиска.
- -H Печаться имя файла для каждого совпадения.
$grep --color=auto -nH 'DIR' *
Результат:

Вы так же можете использовать команду find.
$ find . -name "*.c" -print | xargs grep "main("
Постовой
Отличный интернет магазин, где можно купить фотоаппарат и акссессуары к нему. Низкие цены, возможность кредотования.
Интересный пост про большой адронный коллайдер.
Еще записи по теме
- Делаем ваши bash скриты юзер-френдли с помощью dialog
- Как использовать команду DsQuery для поиска контроллеров домена?
- Советы по PowerShell : Запись сессии в файл
- 5 способов поиска файлов в Linux, используя терминал.
- SFTP c MySecureShell в Debian Etch
- Добавляем дату и время в историю команд bash
- Небольшой совет - как отучить Linux запоминать пароль при использовании sudo
Комментариев: 2
Всё гениальное просто
.
Спасибо, очень помогло.
..bw
Если в именах файлов есть пробелы - пример с find работать не будет.
Поэтому надёжнее использовать следующую комманду:
find -name "*.c" | xargs -d'\n' grep "main("
Однако в именах файлов могут быть и переходы строк (\n),
поэтому самый надёжный способ такой:
find -name "*.c" -print0 | xargs -0 grep "main("