FIND, SED, AWK в Unix-системах

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

Sed — потоковый текстовый редактор (а также язык программирования), применяющий различные предопределённые текстовые преобразования к последовательному потоку текстовых данных.
AWK —  интерпретируемый скриптовый C-подобный язык построчного разбора и обработки входного потока (например, текстового файла) по заданным шаблонам (регулярным выражениям).
Find – утилита поиска файлов по имени и другим свойствам, используемая в UNIX‐подобных ОС.
Для начала разберем утилиту find.
Команда find выглядит так:
find [Путь] [Ключ]
Пример команды по поиску файла с именем «test» по всей системе:

find / -name "test"

find1

Пример команды по поиску файла с именем начинающимся на «test» по всей системе:

find / -name "test*"
find2

Список ключей можно посмотреть выполнив команду man find
Наиболее часто применяемые ключи:
-name – поиск имени;
-type – поиск по типу данных;
-mtime – поиск по времени;
-size – поиск по размеру данных;

Выполним поиск данных с именем начинающимся на «test», тип данных «файл», размер более 10Мб дата создания «более 2 дней»:

find / -name “test*” -type f -size +10M -mtime +2 -print
find3

Нашло 1 файл удовлетворяющий результату.

Так же find позволяет к найденным файлам применять другие команды.
Как пример,  для всех директорий файлов сайта нужно выставить права 755, а для файлов 644.
В директории /home/ создадим 5 папок и 5 файлов:

# cd /home
# mkdir 1
# mkdir 2
# mkdir 3
# mkdir 4
# mkdir 5
# touch 6
# touch 7
# touch 8
# touch 9
# touch 10

Изменим права файлов и папок на 777

#chmod 777 /home/*

Проверяем командой ls -la /home права:

find4

Права для файлов и папок 777.
Теперь с помощью команды find изменим права файлов на 644, а папок на 755:

# find /home/ -type d -exec chmod 0755 "{}" \; && find /home/ -type f -exec chmod 0644 "{}" \;

Проверяем права файлов вновь.

find5
Права изменились на нужные.

О утилитах awk и sed можно писать  очень много, но опишем в статье только некоторые их функции.
Awk – вывод нужных столбцов.
Sed – замена текста.

Как пример, чтобы увидеть только значения прав файлов при выполнении команды ls -la нужно добавить к команде | awk ‘{print $1}’ ,т. к. 1 столбец отвечает за отображение данных прав файлов.
Выполним команду

 ls -la |  awk '{print $1}'
find6

Как видим, отображается только 1 строка данных.
Применим команду awk к логам сервера.
Для начала выведем первые 10 строк логов сервера, с помощью команды

 head /var/log/apache2/access.log
find7

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

head /var/log/apache2/access.log | awk '{print $1,$4,$9}'
find8

Как видим, нам теперь отображаются нужные данные.

Команда sed заменяет данные в файлах.
Запишем текст «ukrnames» в файл /home/10
Выполняем команду

echo "ukrnames" > /home/10
find9

Считываем данные файла

cat /home/10

Теперь заменим в данном файле слово ukrnames на ohp
Выполняем команду

sed -i “s/ukrnames/ohp/g” /home/10

Считываем опять данные с файла

cat /home/10
find10

Как видим, слово в файле изменилось.
Команду sed можно применять вместе с командой find
Ниже будут представлены примеры команд.

Пример замены IP адреса во всех файлах системы (полезно когда мы сменили IP адрес сервера)

find / -type f -exec sed -i "s/8.8.8.8/8.8.4.4/g" "{}" \;

8.8.8.8 – это текущий IP файла, 8.8.4.4 – IP на который нужно заменить.
Пример замены в файлах конфигурации веб-сервера ссылок c http на https

find /etc/apache2/ -type f -exec sed -i "s/http/https/g" "{}" \;

Пример замены в файлах конфигурации веб-сервера URL одного домена на URL другого

find /etc/apache2/ -type f -exec sed -i "s/http:\/\/example.com/http:\/\/example2.com/g" "{}" \;