Предлагаю знающим людям поделиться способами построения конвейеров командной строки (pipelines) в Unix-образных системах. Может быть, получится некоторый справочник :-)
Я начну с некоторых самых примитивных наборов, полезных для обработки журналов web-сервера.
Итак, как всем известно, программа tail — выводит заданное количество строк с конца файла, кроме того, в режиме, задаваемом ключом -f, происходит отображение новых строк в файле в реальном времени.
cat — всего лишь один из способов вывода содержимого файла или нескольких файлов.
cut — позволяет выделить фрагмент строки с заданным индексом, при том, что строка разбивается на фрагменты заданным символом
sort — сортирует несколько строк в нужном порядке по нужным правилам
uniq — удаляет идущие подряд одинаковые строки, с ключём -c добавляет перед каждой строкой количество её повторений
egrep — выбор строк из файла или потока по разным логическим условиям, в том числе по регулярным выражениям
xargs — man xargs
Подразумевается стандартный журнал некоторого веб-сервера access_log в стандартном формате:
10.10.0.1 — - [11/Aug/2008:02:40:15 +0400] «GET / HTTP/1.0» 403 529 «httр://referring.site.com» «Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.3.1.0)»
Чтобы посмотреть что происходит с ресурсом, есть ли запросы и какие:
tail -f access_log
Смотреть только запрашиваемые документы:
tail -f access_log | cut -d' ' -f7
Посмотреть все запрошенные уникальные документы:
cat access_log | cut -d' ' -f7 | sort | uniq
Если хочется поскорее узнать, кто сколько сделал запросов, отсортировать в порядке убывания:
cat access_log | cut -d' ' -f1 | sort | uniq -c | sort -r -d
Смешной пример из реальной практики. Есть небольшой ботнет, атакующий сайт, допускающий при этом ошибку в запрашиваемом URL. Ошибка заключается в том, что на конце URL присутствуют два слеша, а не один, например: '/rss/tag/CSS//'. При помощи небольшого набора консольных программ можно довольно тривиально заблокировать ему доступ (это далеко не самый эффективный способ, так как по одному запросу каждый бот всё же сделает). Подразумевается, что в файрволе ipfw есть таблица 1, всем адресам из которых запрещён доступ к ресурсу. Итак:
cat ./access_log | egrep 'GET [^ ]+// ' | cut -d' ' -f1 | xargs ipfw table 1 add $1
Я начну с некоторых самых примитивных наборов, полезных для обработки журналов web-сервера.
Инвентарь
Итак, как всем известно, программа tail — выводит заданное количество строк с конца файла, кроме того, в режиме, задаваемом ключом -f, происходит отображение новых строк в файле в реальном времени.
cat — всего лишь один из способов вывода содержимого файла или нескольких файлов.
cut — позволяет выделить фрагмент строки с заданным индексом, при том, что строка разбивается на фрагменты заданным символом
sort — сортирует несколько строк в нужном порядке по нужным правилам
uniq — удаляет идущие подряд одинаковые строки, с ключём -c добавляет перед каждой строкой количество её повторений
egrep — выбор строк из файла или потока по разным логическим условиям, в том числе по регулярным выражениям
xargs — man xargs
Что можно с этим сделать
Подразумевается стандартный журнал некоторого веб-сервера access_log в стандартном формате:
10.10.0.1 — - [11/Aug/2008:02:40:15 +0400] «GET / HTTP/1.0» 403 529 «httр://referring.site.com» «Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.3.1.0)»
Чтобы посмотреть что происходит с ресурсом, есть ли запросы и какие:
tail -f access_log
Смотреть только запрашиваемые документы:
tail -f access_log | cut -d' ' -f7
Посмотреть все запрошенные уникальные документы:
cat access_log | cut -d' ' -f7 | sort | uniq
Если хочется поскорее узнать, кто сколько сделал запросов, отсортировать в порядке убывания:
cat access_log | cut -d' ' -f1 | sort | uniq -c | sort -r -d
Смешной пример из реальной практики. Есть небольшой ботнет, атакующий сайт, допускающий при этом ошибку в запрашиваемом URL. Ошибка заключается в том, что на конце URL присутствуют два слеша, а не один, например: '/rss/tag/CSS//'. При помощи небольшого набора консольных программ можно довольно тривиально заблокировать ему доступ (это далеко не самый эффективный способ, так как по одному запросу каждый бот всё же сделает). Подразумевается, что в файрволе ipfw есть таблица 1, всем адресам из которых запрещён доступ к ресурсу. Итак:
cat ./access_log | egrep 'GET [^ ]+// ' | cut -d' ' -f1 | xargs ipfw table 1 add $1