Объединение команды grep с командой find

Вопрос или проблема

Я пытаюсь удалить ненужные данные из директорий rsyslog (в основном много пустых подкаталогов или подкаталогов с одним частичным файлом журнала), но с самыми разными именами, начиная от слов, которые выглядят обрезанными, до 10 дефисов. Я думал, что самый простой способ сделать это – просто искать всё нужное и объявить всё остальное мусором, но здесь возникают трудности.

Мне нужно сохранить

  • 5-10 файлов/подкаталогов по умолчанию, которые создаются при создании нового слушателя rsyslog
  • любую директорию, которая является именем хоста (любой подкаталог, начинающийся с “vd” или “vp”)
  • любую директорию, представляющую IP-адрес.

Всё остальное можно удалить.

Я думал просто использовать grep и исключить всё, что соответствует этим поисковым терминам, а затем сделать список директории в текстовый файл, который я мог бы использовать в качестве входного списка для удаления, но у меня возникают проблемы с именами хостов, как только я ввожу “vp*”, я ничего не получаю. Кроме того, строка, которую я использую для поиска IP-адресов, также захватывает даты.

Мой текущий поиск выглядит следующим образом:

egrep -av 'HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats' |
    grep -E "[^^][0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}" |
    grep -av "vp*" |
    grep -av "vd*"

Если у кого-то есть предложения, я был бы очень признателен, так как если бы я смог это заставить работать, я мог бы запускать это каждые 15-30 минут и поддерживать чистоту всех моих директорий слушателей rsyslog и не загружать так много мусора в свои индексы Splunk.

Спасибо!

#!/usr/bin/env bash

declare -r  RSYSLOG_ROOT_PATH='/path/to/whatever'

cd "$RSYSLOG_ROOT_PATH" || exit 1

for dirname in *; do
    test -L "$dirname" && continue
    test -d "$dirname" || continue
    [[ $dirname =~ ^v[dp] ]] && continue
    [[ $dirname =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] && continue
    [[ $dirname =~ ^(HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats)$ ]] && continue
    echo rm -r "$dirname"
done

Ответ или решение

Конечно. Давайте рассмотрим, как можно эффективно использовать команды grep и find для очистки ненужных данных из директорий rsyslog, сохраняя при этом важные файлы и поддиректории.

Теория

Когда речь идет о системной администрировании и управлении файлами, часто возникает необходимость автоматизировать процесс очистки директорий. Ваша задача состоит в том, чтобы удалить мусорные данные из директорий rsyslog, оставив только необходимые файлы и поддиректории. Вы хотите сохранить:

  1. Стандартные файлы/поддиректории, создаваемые по умолчанию.
  2. Поддиректории, которые являются именами хостов и начинаются с "vd" или "vp".
  3. Поддиректории, имена которых представляют собой IP-адреса.

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

Пример

Рассмотрим пример использования команд find и grep в Bash-скрипте для выполнения вашей задачи. Ниже приведен скрипт, который позволит вам удалять ненужные директории, сохраняя те, что соответствуют вашим критериям.

#!/usr/bin/env bash

declare -r RSYSLOG_ROOT_PATH='/path/to/whatever'

cd "$RSYSLOG_ROOT_PATH" || exit 1

for dir in */; do
    # Пропускаем символические ссылки
    [ -L "$dir" ] && continue
    # Проверяем, является ли элемент директорией
    [ -d "$dir" ] || continue

    # Исключаем директории, начинающиеся с 'vd' или 'vp'
    [[ $dir =~ ^v[dp] ]] && continue

    # Исключаем директории, являющиеся IP-адресами
    [[ $dir =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/$ ]] && continue

    # Исключаем стандартные файлы/директории
    [[ $dir =~ ^(HEAD|GET|version|putenv|id|default|POST|status|rsyslog_stats)/$ ]] && continue

    # Если ни одно из условий не выполнено, удаляем директорию
    echo "Удаление директории: $dir"
    rm -r "$dir"
done

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

Применение

Будучи ИТ-специалистом, вы, вероятно, владеете навыками написания скриптов Bash. Этот скрипт можно настроить для запуска каждые 15-30 минут с помощью планировщика задач, например cron. Это позволит вам автоматизировать процесс очистки без непосредственного вмешательства, что значительно упростит управление ресурсами.

Настройте cron следующим образом:

*/15 * * * * /path/to/your-script.sh

Эта запись в crontab выполнит ваш скрипт каждые 15 минут. Убедитесь, что у скрипта есть права на выполнение, и путь к нему указан правильно.

Заключение

Использование команд grep и find с соответствующими регулярными выражениями для фильтрации директорий позволяет автоматизировать процесс управления данными, экономя время и ресурсы. Убедитесь, что перед применением скриптов на реальных данных произведено тестирование на копии данных, чтобы избежать потери важных данных. Интеграция таких решений в вашу систему администрирования позволит поддерживать порядок и эффективно распределять ресурсы вашего сервера.

Оцените материал
Добавить комментарий

Капча загружается...