🐹 CentOS 7: Как сделать автоматическую замену фрагмента текста во всех файлах?

Содержание:

1. Задача.
2. Выполнение задачи.

2.1. Команда в одну строку.
2.3. Автоматизация процесса.

3. Оригиналы источников информации.


На чем было опробовано:

  1. CentOS Linux release 7.9.2009 (Core).

1. Задача.

Дано: Имеется каталог web-сайта или несколько каталогов с разнообразным содержимым. Внутри каталогов есть еще каталоги и так далее… Целое дерево каталогов.

Задача: Сделать автоматическую замену фрагмента текста на другой фрагмент текста во всех файлах внутри дерева каталогов.

2. Выполнение задачи.

В арсенале CentOS 7 есть пара интересных команд: команда find и команда sed.

Команда find — это одна из наиболее важных и часто используемых утилит системы CentOS 7. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.

Команда sed — это потоковый редактор текста, работающий по принципу замены. Его можно использовать для поиска, вставки, замены и удаления фрагментов в файле. С помощью этой утилиты вы можете редактировать файлы не открывая их. Будет намного быстрее если вы напишите что и на что надо заменить, чем вы будете открывать редактор mcedit, искать нужную строку и вручную всё заменять.

2.1. Команда в одну строку.

Общий функционал команды легко уместится в одну строку:

# find '/mesto-poiska/' -type f -name '*' -exec sed -i -r 's/THIS-IS/TO-THAT/g' {} \;

где:

  • /mesto-poiska/ — каталог, в котором будет осуществлён поиск;
  • * — все файлы подряд, опционально можно добавить маску файлов по ситуации, например, ‘*.txt’;
  • THIS-IS — то, что ищем и хотим заменить;
  • TO-THAT — то, на что мы хотим заменить, то, что ищем.

2.3. Автоматизация процесса.

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

Прокачаем однострочную команду из предыдущего пункта.

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

Для примера сделаем скрипт поиска и замены пары старых IP-адресов на один новый IP-адрес:

Разверните для просмотра...
#!/bin/bash

## Задаем переменные.

# Фрагменты, которые требуется заменить.
word_off_1='10.25.36.29'
word_off_2='10.25.36.28'

# Фрагмент, на который требуется заменить.
word_on='10.12.47.15'

# Лог-файл.
log_path='/sh/find.log'

## Каталоги для операций с заменой.
srv_paths=(
   /etc
   /home
   /root
   /run
   /var
)

# Сброс содержимого log-файла вывода результатов работы скрипта перед новым циклом работы скрипта.
> $log_path;

echo "`date +"%H:%M"` Скрипт стартовал" >> $log_path;
echo "----------------" >> $log_path;

# Действия по замене IP-адресов.
echo -e "\nСкрипт автозамены успешно стартовал!";
echo -e "\nВремя запуска: `date +"%H:%M"`";
echo -e "\nПожалуйста, дождитесь окончания работы скрипта...";

# Счетчик подсчета затраченного времени на автоматическую замену.
TIMEFORMAT="Общее время выполнения скрипта составило %lR"
time {

    # Фрагмент работы автоматического поиска и замены фрагментов текста.
    cd /;
    for line in ${srv_paths[@]};
    do

       echo -e "\n---------- '$line' ----------";

       # WORD_1
       echo "Автозамена $word_off_1 на $word_on" в каталоге $line;
       find $line -type f -name '*' -exec sed -i -r 's/'$word_off_1'/'$word_on'/g' {} \;
       # Проверка успеха выполненной операции, если "0", то скрипт отработал без ошибок.
       echo "Status '$?' - All OK, if status return 0";
       # Визуализация переменных для автозамены.
       echo "'$word_off_1' --> '$word_on' = $line";
       # Контрольная запись о результатах этапа в log-файл.
       echo "`date +"%H:%M"` '$word_off_1' --> '$word_on' = $line" >> $log_path;
       echo "Этап пройден в `date +"%H:%M"`";
       echo -e "";

       # WORD_2
       echo "Автозамена $word_off_2 на $word_on" в каталоге $line;
       find $line -type f -name '*' -exec sed -i -r 's/'$word_off_2'/'$word_on'/g' {} \;
       # Проверка успеха выполненной операции, если "0", то скрипт отработал без ошибок.
       echo "Status '$?' - All OK, if status return 0";
       # Визуализация переменных для автозамены
       echo "'$word_off_2' --> '$word_on' = $line";
       # Контрольная запись о результатах этапа в log-файл.
       echo "`date +"%H:%M"` '$word_off_2' --> '$word_on' = $line" >> $log_path;
       echo "Этап пройден в `date +"%H:%M"`";
       echo -e "";

       echo "-----------------------------------------------------------";

       # Перегородка между этапами замены слов по каталогам в log-файле.
       echo "----------------" >> $log_path;

    done
}

echo -e "\nВремя окончания: `date +"%H:%M"`";
echo -e "\nСкрипт успешно закончил работу!";
echo -e "";

echo "`date +"%H:%M"` Скрипт закончил работу" >> $log_path;

# После работы скрипта, выход с нулевым статусом.
exit 0

Цель заменить IP-адреса в тексте:

# Фрагменты, которые требуется заменить. 
word_off_1='10.25.36.29' 
word_off_2='10.25.36.28'

# Фрагмент, на который требуется заменить. 
word_on='10.12.47.15'

Разместим скрипт в каталоге /sh и добавим на него свойства исполняемости:

# chmod +x /sh/find-sed.sh

Запустим скрипт:

# ./sh/find-sed.sh

Результат работы скрипта:

Содержимое log-файла find.log работы скрипта:

Проверяем целевые файлы на факт замены:

# Фрагменты, которые требуется заменить.
word_off_1='10.12.47.15'
word_off_2='10.12.47.15'

# Фрагмент, на который требуется заменить.
word_on='10.12.47.15'

Как видно замена прошла успешно!

Опционально вы можете сделать ввод фрагментов в скрипт с клавиатуры, расширить список фрагментов для замены, приделать отправку сообщения на почту и так далее.

Ссылка: «CentOS 7: Postfix 3 для отправки электронной почты с внутреннего системного «почтового ящика».

3. Оригиналы источников информации.

  1. losst.ru «Команда find в Linux».
  2. losst.ru «Команда sed в Linux».
  3. novall.net «Простые способы автозамены текста в Linux через SSH».