Однострочники — это конвейеры из команд для выполнения каких-то полезных операций. По-английски они называются one-liners. Разбираться в них тяжелее, чем в обычном многострочном скрипте, но зато их удобно применять и легко отлаживать (не надо постоянно пересохранять файл). Я поделюсь несколькими однострочниками (из тех, что приходилось использовать недавно или регулярно), по возможности расскажу из чего они составлены. И буду со временем дополнять этот пост. Помогайте мне в комментариях.
Проблема: У вас много сайтов на одной CMS, в ней нашлась дырка, надо срочно запатчить.
Задача: Надо искать определенные файлы и заменять в них определенные строки.
Решение:
find /var/www/* -wholename "*/database/database.inc" -exec sed -i -e 's/foreach ($data as $i => $value)/foreach (array_values($data) as $i => $value)/g' {} \;
Начиная с /var/www рекурсивно ищем файлы по маске абсолютного пути (т.е. только те файлы database.inc
, которые обязательно лежат внутри директории database
) и в них меняем все вхождения foreach ($data as $i => $value)
на foreach (array_values($data) as $i => $value)
. Конвейера тут в общем-то нет, результат выполнения find
(имена найденных файлов) передаются sed
(потоковому текстовому редактору) через exec
(а не через конвейер).
Но искать и менять текст в файлах приходится очень часто, поэтому далее очень краткий ликбез по sed
. Общий его синтаксис таков:
sed -e s/было/стало/ file.txt
Нас больше всего интересует команда, которую мы даём редактору через ключ -e
. Команда состоит из следующих компонентов:
s
— это собственно команда замены (она сообщает, что именно должен делатьsed
с текстом);/
— разделитель параметров команды (можно использовать какой-то другой спецсимвол: напишите его послеs
и он будет считаться разделителем, как, напримерs:было:стало
);было
— это то, что нужно искать в файле;стало
— то, на что нужно заменить искомое.
Для того, чтобы менять не только первое найденное вхождение, а все-все, используется модификатор g
в конце команды: s/было/стало/g
Поскольку sed
поддерживает регулярные выражения, некоторые символы внутри команды вам придётся экранировать, например .
(точку), *
(звёздочку), /
(слэш, если он разделитель), '
(одинарную кавычку, если она обособляет команду). Экранирование производится обратным слешем (\
).
Чтобы протестировать работу вашей команды для sed
уберите ключ -i
(тогда результаты замены не будут записываться в файлы, а будут выводиться на экран).
Проблема: На сервере кончается место, надо быстро найти потолстевших кандидатов для чистки
Задача: В красивом сортированном формате показать объём каталогов в определенной ветке файловой системы
Решение:
du -hsx /var/www/* | sort -rh
Полу́чите отсортированный по убыванию вывод в «человеческом» формате, т.е. с единицами измерениями (типа G, M для гигабайтов, мегабайтов). Раньше приходилось извращаться, а теперь у sort
есть ключик h
, который умеет сортировать с учётом единиц измерения.
Кстати, если сделать вот так du -hsx /var/www/*/ | sort -rh
, то команда вам покажет только директории (и не будет показывать файлы, если они вдруг валяются в анализируемой директории).
Проблема: Злые боты взломали какой-то сайт и шлют почтовый спам с вашего сервера.
Задача: Быстро понять, какой сайт взломали.
Решение:
cat /var/log/mail.log | grep 'uid=' | awk -F 'uid=' {'print$2'} | awk {'print $1'} | sed 's/,//g' | sort | uniq -c | sort -n | tail -5 | awk {'print "UID:",$2,"MESSAGES COUNT:",$1'}
Однострочник смотрит почтовый лог и подсчитывает, сколько писем было отправлено от каждого пользователя в системе. В итоге выводит пятёрку самых активных писателей писем. Показывает не имена пользователей, а их идентификаторы (UID), но посмотреть связь между UID и именами вы всегда можете в файле /etc/passwd
Если вы используете не Ubuntu, а, например, CentOS, то вероятнее всего файл лога будет называться /var/log/maillog
(без расширения).
Пример вывода:
UID: 500 MESSAGES COUNT: 1020 UID: 549 MESSAGES COUNT: 257 UID: 595 MESSAGES COUNT: 4202 UID: 547 MESSAGES COUNT: 5010
UID: 605 MESSAGES COUNT: 11694
Сразу видно, что сайт юзера с UID 605 — поломали. А юзеров 595 и 547 надо проверить.
Предполагается, что у вас используется apache2-mpm-itk
или какое-то ещё решение для того, чтобы каждый сайт работал от имени отдельного пользователя. Если все сайты у вас запущены от одного юзера, то такой однострочник вам не поможет.
Примечание: если у вас почтовый лог не ротируется и весит сотни мегабайт, то сервер может поднапрячься. В этом случае, смотрите не весь лог, а только его конец (хвост). Например, замените в начале cat /var/log/maillog
на tail -10000
, чтобы анализировать только 10 тыс. последних строк из лога.
Со временем тут будут появляться всякие другие однострочники, но вы можете меня не дожидаться и постить в комментариях свои.
Важное замечание для новичков: пожалуйста, не выполняйте бездумно однострочники из комментариев в своих системах. Кто-то может пошутить и опубликовать зловредный код.
Проблема: Вы поменяли пароль от БД, надо найти все скрипты, где встречался старый пароль
Задача: Наглядно показать файлы, где есть искомая строка
Решение:
grep -rn '/var/www' -e "oldPassW0rd"
Ключ -r
заставляет поиск работать рекурсивно (заглядывать во все поддиректории). Ключ -n
выведет на экран номер строки (или строк), где обнаружено вхождение.
»