Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Скрипт на bash - разбор лога (получить уникальные имена запрошенных ресурсов)  (Прочитано 1141 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Свет_в_окошке

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Господа, прошу помочь, т.к. в программировании сама - полный ноль! Требуется вывести из лога уникальные(не повторяющиеся) имена всех запрошенных ресурсов... Понимаю, что надо записывать всё в temp-файл, но КАК? Может, есть какие-нибудь наработки или ссылки, чтобы почитать?) То есть, допустим, из строки "127.0.0.1 - - [15/Sep/2014:15:32:23 +0600] "GET /denwer/ HTTP/1.1" 200 16324" мне нужно получить "/denwer/"... Заранее СПАСИБО каждому, кто поможет)))  :)

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3271
    • Просмотр профиля
Для этого есть более чем достаточно утилит.
Эту задачу удобно решать, если запрос любого ресурса имеет один и тот же формат.
Искать по общему для всех сочетанию в той строке, в которой упоминается также и ресурс,
удобнее с помощью
grep "pattern" log-file > log_cЗатем надо удалить из него одинаковые строки, а перед этом отсортировать
sort log_c >log_c_s
uniq log_c_s log_c_s_u
Затем для вывода имён ресурсов удобно восползоваться программой cut, но надёжнее awk.
Предположим, что каждая строка в log_c_s_u состоит из частей, разделённых одиночными пробелами
и имя ресурса - в 3-м поле. Тогда их имена выведет команда
cut -d " " -f 3 log_c_s_u > log_c_s_u_rА если пробелы не одиночные, их можно сделать таковыми командой
tr -s " " <log_c_s_u >log_c_s_u1
« Последнее редактирование: 24 Ноября 2014, 18:59:13 от Peter_I »
Пётр.

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 7840
  • Eternally
    • Просмотр профиля
если в логе не встречается разных по формату записей, то

cat file | grep GET | cut -d' ' -f7 | uniq
cat file       - читаем файл
grep GET      - выбираем только строки с запросом "GET"
cut -d' ' -f7     - делим строку на поля, разделитель пробел, нам нужно седьмое поле
uniq                    - только уникальные имена
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Свет_в_окошке

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
Peter_I,большое спасибо за помощь!
« Последнее редактирование: 24 Ноября 2014, 19:07:01 от Свет_в_окошке »

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3271
    • Просмотр профиля
Ещё, если заранее известны имена всех ресурсов, то с помощью
rm -f resource_number
while resourse read
 do
grep -c $resource log-file >> resource_number
 done < resource_list
можно получить файл из строк, где каждая будет состоять из числа запросов каждого ресурса.
Если не 0, то он был запрошен.
Пётр.

Оффлайн Свет_в_окошке

  • Автор темы
  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
ALiEN175, спасибо большое!



Пользователь решил продолжить мысль 24 Ноября 2014, 19:08:49:
Peter_I, очень полезная информация, спасибо!

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 3271
    • Просмотр профиля
Рад быть полезным, но 2-й вариант может оказаться нерациональным.
Пётр.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net

 

Страница сгенерирована за 0.016 секунд. Запросов: 21.