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.
Thank you very much!
Спасбо большое. Очень помогло.
Спасибо. Только начинаю изучать grep и awk, собираю информацию по крупицам. Может быть подскажете какое-нибудь полное руководство? Или следует просто покупить man?
для grep достаточно и man, там не так много опций ..
а вот для awk есть переводы и руководства, я его использую редко и в узком направлении, по этому не посоветую ничего так как не читал ))
grep -r “test” *
-bash: /usr/bin/grep: Argument list too long
попробовать как-то так еще можно:
find test/ -type f -exec grep “чт-то-тут” {} \;
объясните, что значит “Поиск рекурсивно”. Рекурсия – это функция, которая вызывает сама себя.
А поиск рекурсивно – это поиск в искомом?..
grep должен иметь обязательный параметр где выполнять поиск строки – это либо файл, либо стандартный ввод данных.
когда мы хотим выполнить поиск по всем файлам в папке и укажем просто название папки – он не будет искать внутри папки во всех файлах, так как команда принимает обязательный параметр имя файла где искать.
опция -r говорит что нужно выполнять поиск рекурсивно, то есть, искать в всех файлах в указанной директории и в файлах во всех подпапках. Грубо говоря, получить список всех файлов из всех подпапок разного уровня внутри указанной папки и выполнить поиск в этих файлах.
Даже не знаю, как вам так объяснить чтобы не запутать )
ваше описание скорее всего подходит для какого-определенного примера рекурсии в программировании, но не подходит полностью как глобальное обозначение рекурсии.
Например посмотреть рекурсивно что внутри матрешки – это значит открывать все матрешки меньшие внутри большой и проверять в каждой ). А не просто открыть самую большую и сказать что в ней не открывая остальные меньшие. Это в данном контексте с командой grep
я так понял:
#grep authorized /root – ищет только в папке /root;
#grep -r authorized /root – ищет в папке /root и всех ее подпапках;
#grep authorized /root – это поиск фразы в файле /root, если это папка без ключа -r вы не получите никакого результата
#grep -r authorized /root — ищет в папке /root и всех ее подпапках;
верно, ищет во всех найденных файлах в папке /root и ее подпапках.
Рекурсия в чем здесь заключается, скорее всего есть функция которая получает список файлов в папке, и когда в списке есть другие папки она вызывает сама себя и получает список файлов в подпапках и также для подпапок других уровней, после чего выполняет поиск в найденных файлах. Это в меру моего понимая в чем здесь рекурсия 🙂
Спасибо большое за ответы.
Как я понял, разница между grep и find в том, что grep ищет внутри файла, а find – по именам файлов?
А вот с предыдущим наконец разобрался:
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/
да. 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
еще в grep удобно выполнять поиск по нескольким условиям. Например, вывести все файлы в папке /root где есть строка “rm” или “cp”:
тут нам помогает ключ -E чтобы указать несколько условий поиска…
grep -rliE “rm|cp” /root