Linux и Windows: помощь админам и пользователям

Администрируем и настраиваем Windows, Linux.



Как найти файлы с определенным содержимым в Unix

Рубрика: Shell
Метки: |
Понедельник, 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
  • FILE.c FILE.C).

  • -R : Проверяет все файлы в каждой вложенной директории, рекурсивно.

Подсвечиваем найденные шаблоны

Вы можете легко подсветить найденные вхождения шаблона:

$ 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("

Постовой

Отличный интернет магазин, где можно купить фотоаппарат и акссессуары к нему. Низкие цены, возможность кредотования.

Интересный пост про большой адронный коллайдер.

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Комментариев: 2

  1. Всё гениальное просто grin.

    Спасибо, очень помогло.

    ..bw

  2. Алексей | 2009-08-04 в 20:10:32

    Если в именах файлов есть пробелы - пример с find работать не будет.

    Поэтому надёжнее использовать следующую комманду:

    find -name "*.c" | xargs -d'\n' grep "main("

    Однако в именах файлов могут быть и переходы строк (\n),

    поэтому самый надёжный способ такой:

    find -name "*.c" -print0 | xargs -0 grep "main("

Оставьте комментарий!

Используйте нормальные имена.

Имя и сайт используются только при регистрации

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email. При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д., а также подписку на новые комментарии.

(обязательно)