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 ответов

26 просмотров

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

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

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

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й элемент и есть конвертация в инт"

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта