bash команда grep

grep  — Поиск файлов или строки в файле по шаблону.

grep "шаблон поиска" "file_name"

Допустим в папке /root у нас лежит три файла:
/root/.bash_history
/root/.bash_history
/root/test

-r Поиск рекурсивно по всем файлам в указанной директории. Пример:

#grep -r authorized /root

/root/.bash_history:mv authorized_keys authorized_keys2
/root/.bash_history:chmod 600 authorized_keys2
/root/test: authorized_keys2 test file



-h Не выводит имя файла при поиске по нескольким файлам. Пример:

#grep -rh authorized /root

mv authorized_keys authorized_keys2
chmod 600 authorized_keys2
authorized_keys2 test file


-l Выводит только имена файлов, в которых найдена строка. Если в файле есть несколько таких строк, то имя файла выводится только один раз. Пример:

#grep -rl authorized /root

/root/.bash_history
/root/test


-c Выводит количество найденных строк. Пример

#grep -с authorized /root/.bash_history

2


#grep -rlс authorized /root

3

-v Выводит все строки кроме содержащих указанный шаблон.

-i Игнорировать регистр при поиске. То есть если Вы указали шаблон поиска с маленьких букв, в результат
попадут также строки, где встречается этот шаблон с заглавными буквами.

-n Добаляет номер найденной строки в начало ее вывода.

-s Подавляет вывод ошибок о ненайденом файле, например.

-w Поиск шаблона как отдельного слова, например поиск по -w «auth» не будет включать в результат строки, где встречается «authentic», а только строки где есть отдельоне слово auth.

19 comments on “bash команда grep

  1. Victor 27.06.2012 11:18

    Thank you very much!

  2. artiom 20.01.2013 18:10

    Спасбо большое. Очень помогло.

  3. sarovchanin 21.09.2013 09:10

    Спасибо. Только начинаю изучать grep и awk, собираю информацию по крупицам. Может быть подскажете какое-нибудь полное руководство? Или следует просто покупить man?

  4. admin 07.10.2013 18:33

    для grep достаточно и man, там не так много опций ..
    а вот для awk есть переводы и руководства, я его использую редко и в узком направлении, по этому не посоветую ничего так как не читал ))

  5. Dmitry 29.11.2013 17:35

    grep -r «test» *
    -bash: /usr/bin/grep: Argument list too long

  6. admin 13.12.2013 17:41

    попробовать как-то так еще можно:
    find test/ -type f -exec grep «чт-то-тут» {} \;

  7. Dima 20.12.2013 20:09

    объясните, что значит «Поиск рекурсивно». Рекурсия — это функция, которая вызывает сама себя.
    А поиск рекурсивно — это поиск в искомом?..

  8. admin 23.12.2013 13:31

    grep должен иметь обязательный параметр где выполнять поиск строки — это либо файл, либо стандартный ввод данных.

    когда мы хотим выполнить поиск по всем файлам в папке и укажем просто название папки — он не будет искать внутри папки во всех файлах, так как команда принимает обязательный параметр имя файла где искать.

    опция -r говорит что нужно выполнять поиск рекурсивно, то есть, искать в всех файлах в указанной директории и в файлах во всех подпапках. Грубо говоря, получить список всех файлов из всех подпапок разного уровня внутри указанной папки и выполнить поиск в этих файлах.

    Даже не знаю, как вам так объяснить чтобы не запутать )

  9. admin 23.12.2013 13:38

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

    Например посмотреть рекурсивно что внутри матрешки — это значит открывать все матрешки меньшие внутри большой и проверять в каждой ). А не просто открыть самую большую и сказать что в ней не открывая остальные меньшие. Это в данном контексте с командой grep

  10. Dima 23.12.2013 14:19

    я так понял:
    #grep authorized /root — ищет только в папке /root;
    #grep -r authorized /root — ищет в папке /root и всех ее подпапках;

  11. admin 23.12.2013 16:48

    #grep authorized /root — это поиск фразы в файле /root, если это папка без ключа -r вы не получите никакого результата

    #grep -r authorized /root — ищет в папке /root и всех ее подпапках;
    верно, ищет во всех найденных файлах в папке /root и ее подпапках.
    Рекурсия в чем здесь заключается, скорее всего есть функция которая получает список файлов в папке, и когда в списке есть другие папки она вызывает сама себя и получает список файлов в подпапках и также для подпапок других уровней, после чего выполняет поиск в найденных файлах. Это в меру моего понимая в чем здесь рекурсия 🙂

  12. Dima 23.12.2013 17:27

    Спасибо большое за ответы.
    Как я понял, разница между grep и find в том, что grep ищет внутри файла, а find — по именам файлов?

  13. Dima 23.12.2013 17:48

    А вот с предыдущим наконец разобрался:
    1)server# grep «12345» 1_check.sh
    echo -ne «12345${i} «;
    ssh 12345${i} ‘lsof |wc -l’
    2) server# grep -r «12345» /racl/ep/
    ./1_check.sh: echo -ne «12345${i} «;
    ./1_check.sh: ssh 12345${i} ‘lsof |wc -l’

    В первом случае ищется именно в конктетном файле,
    во втором — во всех подпапках /racl/ep/

  14. admin 23.12.2013 17:50

    да. find помощнее будет как по мне, там можно еще выполнять команды над результатами поиска через -exec разные варианты поиска. Ну, каждая команда решает свою задачу. Чаще всего grep использую с ключами -rli. То есть, вывести список файлов (-l) рекурсивно во всех поддиректориях (-r), в которых найдена фраза без учета регистра(-i).
    с результатами grep можно работать применяя цикл for i in. Например удалить все файлы, в которых найдена фраза «virus»:
    for i in `grep -rli «virus» ./`; do rm -rf $i ;done
    ну и там через точку с запятой можно много разных операций выполнить над результатом.
    иногда можно воспользоваться xargs, в данном случае чтобы удалить файлы будет так:
    grep -rli «virus» ./ | xargs rm -rf

  15. admin 23.12.2013 17:56

    еще в grep удобно выполнять поиск по нескольким условиям. Например, вывести все файлы в папке /root где есть строка «rm» или «cp»:
    тут нам помогает ключ -E чтобы указать несколько условий поиска…
    grep -rliE «rm|cp» /root

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>