Как найти строку в файлах на линукс (Ubuntu)?

Итак встречайте героев сегодняшнего обзора: locate — предоставляет поиск по имени файла в заранее подготовленной базе данных, find — работает на реальной файловой системе и предоставляет невероятные возможности для поиска файлов и папок по различным параметрам. Также мы расскажем вскользь о grep — утилите для поиска текста в файлах.

ОПЦИИ

Давайте рассмотрим самые основные опции утилиты grep, которые помогут нам выполнять поиск текста в файлах:

  • -b — показывать номер блока перед строкой;
  • -c — подсчитать количество вхождений шаблона;
  • -h — не выводить имя файла в результатах поиска внутри файлов Linux;
  • -r — рекурсивный поиск;
  • -i — не учитывать регистр;
  • — l — отобразить имена файлов, в которых найден шаблон;
  • -n — показывать номер строки в файле;
  • -s — не показывать сообщения об ошибках;
  • -v — инвертировать поиск, выдавать все строки кроме тех, что содержат шаблон;
  • -w — искать шаблон как слово, окружённое пробелами;
  • -e — использовать регулярные выражения при поиске;
  • -An — показать вхождение и n строк до него;
  • -Bn — показать вхождение и n строк после него;
  • -Cn — показать n строк до и после вхождения.

Как найти строку в файлах на линукс?

В этом нам поможет утилита командной строки под названием grep. Она ищет строки, которые отвечают регулярному выражению и выводит их на консоль.

Обратите внимание на следующее

  1. Используйте скобки, если строка содержит пробелы «текст команды«.
  2. Помните про пробелы между расширениями {js,java}
  3. Не используйте фигурные скобки для одного расширения {java}  -> java
Читайте также:  Какой принтер лучше выбрать

Ниже представлены наиболее полезные команды, которые я использую в повседневной работе, а также другие работающие команды, найденные на просторах Интернета:

Простой поиск строки в файле

Структура команды: grep строка названиеФайла

Пример использования: grep name

Поиск строки в файле игнорируя чувствительность к регистру

Структура команды: grep строка названиеФайла

Пример использования: grep -i name

Найти строку в текущей директории

Структура команды: grep строка .

Пример использования: grep name .

Найти строку рекурсивно

Структура команды: grep -r строка .

Пример использования: grep -r name .

Найти файлы, которые не содержать определенную строку

Структура команды: grep -L строка *

Пример использования: grep -L «foo» *

Рекурсивно найти строку только в определенных файлах

Структура команды:

grep  строка -r . —include=*.расширениеФайла 

grep строка -r . —include=*.{расширениеФайла, расширениеФайла2}

Пример использования: grep «name=Main» -r . —include=*.java

Обратите внимание! Эти команды буду искать только в тех файлах, которые вы определили в секции —include=*.{…}

Рекурсивно найти строку кроме определенных расширений

Структура команды: grep  строка -r . —exclude=*.{расширениеФайла}

Пример использования: grep «Serializable» -r . —exclude=*.{jar,js,index}

Рекурсивно найти строку в определенных расширениях, исключая указанные

Структура команды:

grep  строка -r . —include=*.расширениеФайла  —exclude=*.расширениеФайла2

grep  строка -r . —include=*.{расширениеФайла,расширениеФайла2} —exclude=*.{расширениеФайла3,расширениеФайла2}

Пример использования: grep «name=Main» -r . —include=*.{java,html} —exclude=*.java

Обратите внимание! Команда выше не будет искать в файлах с расширением .java

Ищите другие полезности в специальном разделе.

Больше полезных статей!

  • Читаем XML файл в Java с помощью StAX
  • Как преобразовать изображение в массив байтов на Java?
  • Android Internal Storage: пример работы с внутренней памятью
  • Как изменить XML файл в Java: используем DOM Parser

Действия

Команда find дает вам результаты поиска, а затем возможность выполнить действия над ними. Вот несколько предопределенных действий:

Действие Описание
-delete Удаляет файлы, соответствующие критериям поиска
-ls Показывает подробный вывод ls с размерами файлов и количеством inode
-print Показывает полный путь к соответствующим файлам. Это действие по умолчанию, если не указано другое действие.
-exec Выполняет следующую команду в каждой строке результатов поиска.

Итак, если вы хотите найти все пустые файлы и удалить их, вы можете сделать это следующим образом:

$ find . -empty -delete

Внимание: перед использованием действия удаления всегда можно безопасно запустить команду один раз с действием -print и подтвердить результаты.

Действие -exec является особенным. Это позволяет вам выполнить команду по вашему выбору в результатах поиска:

-exec command {} \;

где:

  • command — это команда, которую вы хотите выполнить для результатов поиска, например rm, mv или cp.
  • {} представляет результаты поиска.
  • Команда заканчивается точкой с запятой после обратной косой черты.

Итак, команду поиска и удаления всех пустых файлов можно записать так:

$ find . -empty -exec rm {} \;

Вот еще один пример использования действия -exec. Следующая команда копирует все .png изображения в каталог backup/images:

$ find . -name "*.png" -exec cp {} /backups/images \;

Поиск папки

На самом деле поиск папки в linux ничем не отличается от поиска файла, так как папка — это файл. Однако find дает нам возможность указать тип. Например, чтобы явно выполнить поиск только папок, имена которых содержат слово, например, mysql, выполните

# find / -type d -name «*mysql*»

Здесь ключ «-type» указывает на тип. На текущий момент времени find поддерживает следующие типы:

  • b — блочное устройство
  • c — символьное устройство
  • d — папка (дирректория)
  • p — именнованный канал
  • f — обычный файл
  • l — символическая ссылка
  • s — сокет
  • D — дверь (только для Solaris)

Подробнее о различных параметрах поиска find вы можете почитать, введя команду

$ man find

Поиск текста в Linux при помощи утилиты grep

Да, grep действительно очень хорош, когда речь заходит о поиске текста в файлах в linux по паттерну. Сразу оговоримся, что искать текст мы будем в файлах в формате plain text — чистый текст, таких как конфигурационные файлы, сценарии командного интерпретатора (bash. python, php…) и др. Искать по файлам Word и Excel грепом эффективно вряд ли получится.

Итак, чтобы выполнить поиск строки по всем файлам в каталоге, например /etc следует ввести

# grep -lri root /etc/*

Такая команда выведет имена всех файлов, в которых удастся найти заветные 4 буквы «root». Здесь ключ «-l» заставляет grep выводить только имена файлов. Т.е. если вы хотите увидить ещё и ту саму строку, где удалось найти запрашиваемое слово, то «-l» стоит не указывать. Ключ «-r» выполняет поиск не только по /etc, но и по всем файлам во всех подпапках. И наконец ключ «-i» говорит не принимать во внимание регистр, т.е. grep будет искать не только слово «root», но и «ROOT», и «rOOt»… Вы поняли

Читайте также:  Как загрузить и установить iOS 13.1.3 на свой iPhone |

Конечно, вмемогущий grep поддерживает регулярные выражения. Чтобы выполнить, например, поиск строки, явно начинающийся всё с того же слова, введите

# grep -lri ^root /etc/*

Крышка в начале слова «root» обязывает grep выводит только те файлы, где слово «root» стоит в начале строки. И таких трюков достаточно много. Если вы еще не знакомы с regex, то стоит начать хотябы с википедии

Удаление файлов и папок

Обычное удаление файла:

rm /etc/

Если с помощью обычного rm попробовать удалить папку в которой находятся файлы, появится ошибка. Для удаление папок используем другую команду:

rmdir backup

Добавляем атрибут -p для удаление пустых папок по всему пути. Будут удалены все три папки указанные ниже, если они не содержат файлов:

rmdir -p backup/one/two

Ошибка папки при удалении в Linux

Иногда при удалении папки в Linux пишется ошибка:

rmdir: не удалось удалить «название_папки»: Нет такого файла или каталога

При этом зайти в неё тоже не удаётся, пишется ровно противоположное:

-bash: cd: /название_папки: Нет такого файла или каталога

Также встречаются ошибки:

rm: невозможно удалить «/home/admin/web/public_html»: Это каталогrmdir: не удалось удалить «/home/admin/web/public_html»: Каталог не пуст

Удалить эту капризную папку (без предупреждений) поможет следующая команда:

rm -rf backup

или так:

rm -rf /home/admin/web/public_html

где -r – команда пройтись по всем папкам и файлам и попытаться удалить каждую из них -f – удалить без подтверждения

Удалить всё внутри папки

Зайти внутрь папки:

cd folder

Удалить все в этой папке:

sudo rm -rf ./*

Удаление файлов из директории Linux без удаления самой папки

Удаляем всё содержимое из папки files, которая находится по этому пути – /home/user/files/. Специальные ключи в команде ускоряют удаление содержимого с минимальной нагрузкой на сервер.

find /home/user/files/ -mindepth 1 -a -print0 | xargs -n 100 -0 rm -rf

Удалить все файлы кроме одного конкретного файла

rm -v !("")

Удалит все файлы, кроме одного. Эта команда не удаляет папки.