170 похожих чатов

Ребята, привет. Есть ли аналог awk в Python3 ? Задача

- отсортировать IP адреса по количеству запросов, где статус код 200, подсчитать количество запросов с каждого из IP адресов
cat access.log | head -n 2
13:55:30 187.233.224.30 https://samplesite.com/cghcfgcecb.php 404
13:55:31 216.8.199.224 https://samplesite.com/cfaddbedhh.php 302

Чтобы получить вывод такого формата (отсортированный по количеству:
IP адрес, количество запросов с ответом 200

Вот всё норм, как грамотно парсить табуляцию (\t) ? Или может у кого-то есть готовое решение?

35 ответов

24 просмотра

Да хоть как ксв

а что 🇷🇺
Да хоть как ксв

Можно даже пандасом прочитать

Sapienti-Sat Автор вопроса

Переформулирую вопрос: есть файл со стороками: 13:55:30 187.233.224.30 https://samplesite.com/cghcfgcecb.php 404 В строке 4 поля - time, IP, URL, status, разделенные табуляцией \t Нужно проверить 4 столбец на наличие значения "200" Как это красиво сделать? Если просто по строке искать, то в поле url тоже может быть значение 200, например https://samplesite.com/chafsidjhfosidf.php?param=200

Sapienti Sat
Переформулирую вопрос: есть файл со стороками: 13:...

Распарсить файл в список dict/объектов, а затем сравнивать у каждого элемента поле с нужным тебе значением

Sapienti-Sat Автор вопроса
Максим Мартынов
Распарсить файл в список dict/объектов, а затем ср...

файл огромный и динамический, не вызовет ли это проблем? (поэтому работаю с конкретной строкой)

Sapienti-Sat Автор вопроса
Максим Мартынов
Что значит динамический

значит старые строки удаляются, но появляются новые (ротация лога)

Sapienti Sat
Переформулирую вопрос: есть файл со стороками: 13:...

можно построчно через .split(' ') потом из полученного массива 4й элемент проверяй на 200

Sapienti-Sat Автор вопроса
Sapienti Sat
вот да. точно. спасибо

С постоянно обновляемым файлом все не так просто

Sapienti-Sat Автор вопроса
Максим Мартынов
С постоянно обновляемым файлом все не так просто

Оно понятно, но под текущую задачу подходит вариант с работой с конкретной строкой на момент открытия файла. Тут другая проблема сейчас. Я парсю строку в список, и всё работает. То есть я могу вывести строку как список после сплита. Всё хорошо тут. ['14:18:29', '88.7.61.66', 'https://samplesite.com/ahdffgcffh.php', '200\n'] или выводить только 4 столбец - тоже всё ок. Но когда я пытаюсь сделать так: if log_line[3] == 200: то всегда возвращается false. пробовал еще так (на всякий случай) if str(log_line[3]) == "200":

Sapienti Sat
Оно понятно, но под текущую задачу подходит вариан...

Ты перевод строки в видишь? И то, что сравниваешь строку с числом?

Sapienti-Sat Автор вопроса
Максим Мартынов
Ты перевод строки в видишь? И то, что сравниваешь ...

увидел. спасибо :) То есть, у меня сраванивалось 200\n с 200

Sapienti Sat
Оно понятно, но под текущую задачу подходит вариан...

Ты хочешь сделать мониторинг на основе логов. Это дичь, так делать не нужно

Sapienti-Sat Автор вопроса
Максим Мартынов
Ты хочешь сделать мониторинг на основе логов. Это ...

это тестовое задание :) Так-то я под анализ логов использую логстеш эластик и кибану :) + задание я реализовал на баше в 2 строки c использованием awk sort uniq А вот на Python с ходу не получается уже

Sapienti-Sat Автор вопроса
Eldar
На какую позицию тестовое?

AppSec Engineer однострочник на баше выглядит так: awk '$4 == "200"' access.log | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10 Теперь надо это реализовать на Python :)

Sapienti Sat
AppSec Engineer однострочник на баше выглядит так...

os.system("awk '$4 == "200"' access.log | awk '{print $2}' | sort | uniq -c | sort -nr | head -n 10") не благодари

Sapienti-Sat Автор вопроса
Sapienti Sat
да, это план Б :)))

Можно потом в любом случае сразу две версии отправить )))

Sapienti Sat
да, это план Б :)))

with Path("path_to_your_log_file").open("r") as f: lines = f.readlines() lines_with_200 = list(filter(lambda o: int(o.split(" ")[3]) == 200, lines)) можно вместо лямбды нормальную функцию с проверками что есть сплит, есть 4й элемент и есть конвертация в инт

Sapienti-Sat Автор вопроса
Алексей
with Path("path_to_your_log_file").open("r") as f:...

Ну основная часть есть(всё проверяется), сейчас осталось подсчитать IP адреса, с которых были 200, отсортировать IP по количеству запросов с 200 ответом и вывести топ10 :)

Sapienti Sat
Ну основная часть есть(всё проверяется), сейчас ос...

set([1, 2, 1]) >>> {1, 2} sorted([5, 1, 4]) >>> [1, 4, 5] Если надо отсортировать + уникальные list(sorted(set([1, 5, 5, 4])))

Sapienti-Sat Автор вопроса

на примере выглядит очень просто. :)

ShiroNoHaga
set([1, 2, 1]) >>> {1, 2} sorted([5, 1, 4]) >>> [...

sorted возвращает список, второй раз не нада в него загонять

ShiroNoHaga
set([1, 2, 1]) >>> {1, 2} sorted([5, 1, 4]) >>> [...

sorted() и так возвращает список, list() уже не нужно добавлять

Sapienti Sat
Ну основная часть есть(всё проверяется), сейчас ос...

from collections import Counter with Path("ttt.txt").open("r") as f: lines = f.readlines() lines_with_200 = Counter(list(filter(lambda o: int(o.split(" ")[3]) == 200, lines))).most_common() print("\n".join([f"Count: {v}, URL: {k.strip()}" for k, v in lines_with_200][:10]))

Алексей
from collections import Counter with Path("ttt.txt...

Может хотя бы моноширинным?

Алексей
from collections import Counter with Path("ttt.txt...

int(o.split(" ")[3]) == 200 Я б не делал А если там не число?

ShiroNoHaga
int(o.split(" ")[3]) == 200 Я б не делал А если ...

вы сообщение до конца дочитали? "можно вместо лямбды нормальную функцию с проверками что есть сплит, есть 4й элемент и есть конвертация в инт"

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта