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
3
-v Виводить всі рядки крім містять вказаний шаблон.
-i Ігнорувати регістр при пошуку. Тобто якщо Ви вказали шаблон пошуку з маленьких букв, в результат
потраплять також рядки, де зустрічається цей шаблон з великими літерами.
-n добаляют номер знайденої рядки в початок її виведення.
-s Пригнічує висновок помилок про незнайдені файлі, наприклад.
-w Пошук шаблону як окремого слова, наприклад пошук по -w «auth" не буде включати в результат рядки, де зустрічається «authentic», а тільки рядки де є отдельоне слово auth.
grep повинен мати обов'язковий параметр де шукати рядки - це або файл, або стандартний ввід даних.
коли ми хочемо виконати пошук по всіх файлів в папці і вкажемо просто назва папки - він не буде шукати всередині папки у всіх файлах, так як команда приймає обов'язковий параметр ім'я файлу де шукати.
опція -r каже що потрібно виконувати пошук рекурсивно, тобто, шукати в усіх файлах у вказаній директорії і в файлах у всіх підпапках. Грубо кажучи, отримати список всіх файлів з усіх підпапок різного рівня всередині зазначеної папки і виконати пошук в цих файлах.
Навіть не знаю, як вам так пояснити щоб не заплутати)
ваше опис швидше за все підходить для будь-певного прикладу рекурсії в програмуванні, але не підходить повністю як глобальне позначення рекурсії.
Наприклад подивитися рекурсивно що всередині матрьошки - це значить відкривати все матрьошки менші всередині великий і перевіряти в кожній). А не просто відкрити найбільшу і сказати що в ній не відкриваючи інші менші. Це в даному контексті з командою grep
я так зрозумів:
#grep authorized / root - шукає тільки в папці / root;
#grep -r authorized / root - шукає в папці / root і всіх її підпапках;
А ось з попереднім нарешті розібрався:
1) server # grep «12345» 1_check.sh
echo -ne «12345 $«;
ssh 12345 $ 'lsof | wc -l'
2) server # grep -r «12345» / racl / ep /
./1_check.sh: echo -ne «12345 $«;
./1_check.sh: ssh 12345 $ '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