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

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