LINUX.ORG.RU

Просьба помочь с парсингом логов на Linux

 , ,


1

1

Предыстория: Есть лог SMTP-шлюза системы, в который записывается информация о принимаемых SMTP-шлюзом сообщениях. Одна строка лога выглядит, как:

1. Время поступления сообщения (2018-08-27 13:12:47.011183500))

2. Объем принятого сообщения в байтах (23870 bytes)

3. От кого пришло сообщение (ip-адрес и адрес отправителя) (from 10.10.10.10 (sender <>))

4. На какой адрес пришло сообщение (адрес получателя) (to Journaling@test.local)

5. ID, который был присвоен сообщению (id norm-bee0f95a-a9e1-11e8-b31a-005056880582)

Задача 1: Получить количество сообщений, которое пришло с ip-адреса 10.10.10.10

Задача 2: Получить объем сообщений в Мб, которое пришло с ip-адреса 10.10.10.10

Результатом по обоим задачам должны быть команды Linux + плюс полученные значения.

----------- Пример лога приложил. --------------------------------------------------

2018-08-27 13:12:47.011183500 SMTP proxy received 23867 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-bee0f95a-a9e1-11e8-b31a-005056880582)

2018-08-27 13:12:49.844212500 SMTP proxy received 23870 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-c091728e-a9e1-11e8-adb1-005056880582)

2018-08-27 13:12:50.928585500 SMTP proxy received 23858 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-c136b62c-a9e1-11e8-addf-005056880582)

2018-08-27 13:12:51.993576500 SMTP proxy received 23864 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-c1d9ccb8-a9e1-11e8-ae34-005056880582)

2018-08-27 13:14:41.280304500 SMTP proxy received 30086 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-02fdc898-a9e2-11e8-b5b6-005056880582)

2018-08-27 13:14:44.252948500 SMTP proxy received 29677 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-04c36e8a-a9e2-11e8-ade2-005056880582)

2018-08-27 13:15:07.143560500 SMTP proxy received 1152 bytes of data from 10.10.10.11 (sender agent@host) to filter@host (id norm-12695f4a-a9e2-11e8-acad-005056880582)

2018-08-27 13:15:32.167600500 SMTP proxy received 1152 bytes of data from 10.10.10.11 (sender agent@host) to filter@host (id norm-2153b8ac-a9e2-11e8-8278-005056880582)

2018-08-27 13:16:42.680560500 SMTP proxy received 35207 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-4b5aeb20-a9e2-11e8-8954-005056880582)

2018-08-27 13:16:42.691911500 SMTP proxy received 10147 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-4b5cbfa4-a9e2-11e8-8adc-005056880582)

2018-08-27 13:16:53.910028500 SMTP proxy received 283348 bytes of data from 10.10.10.10 (sender <>) to Journaling@test.local (id norm-520a0582-a9e2-11e8-ad59-005056880582)

Ответ на: комментарий от Bosswik

readline'ом вычитываешь строки, потом с помощью awk или cut режешь её на компоненты, находишь нужные (размер и ип) и если совпадает ИП, то инкрементишь что там тебе надо. Сложение можно реализовать с помощью bc.

turtle_bazon ★★★★★ ()
$ grep -cP 'SMTP proxy received \d+ bytes of data from 10.10.10.10 ' /tmp/testlog
$ 9
$ grep -oP '(?<=SMTP proxy received )\d+(?= bytes of data from 10.10.10.10 )' /tmp/testlog | paste -s -d + - | bc
$ 483924
Pravorskyi ★★ ()
Ответ на: комментарий от turtle_bazon

если не сложно можно поподробнее ( как для чайника или человека мало работающего с линуксом))

Bosswik ()
Ответ на: комментарий от Bosswik

Лучше обрамлять в тег [code] или аналог из Markdown. При редактировании или отправлении сообщения внизу есть справка.

Pravorskyi ★★ ()

Задача 1: Получить количество сообщений, которое пришло с ip-адреса 10.10.10.10 При условии, что 1 строка это 1 сообщение:

awk 'BEGIN {counter=0} $11 == "10.10.10.10" {counter+=1} END {print counter}'

Задача 2: Получить объем сообщений в Мб, которое пришло с ip-адреса 10.10.10.10

awk 'BEGIN {size=0} $11 == "10.10.10.10" {size+=$6} END {printf "%d bytes\n", size}'

Но это топорно. Тут нет проверок на то, что указанные поля это именно IP, а не другое поле из-за изменившегося кол-ва полей до IP.

Yorween ()
Ответ на: комментарий от Yorween

Перечитал я свое сообщение и увидел, что забыл в мегабайты перевести…

awk 'BEGIN {size=0} $11 == "10.10.10.10" {size+=$6} END {printf "%.2f Mb\n", size/1000000}'
Yorween ()
Ответ на: комментарий от Yorween

а результат моего примера логов будет какой? две цифры? или как примерно будет выглядить ответ после выполнения данных команд?

Bosswik ()
Ответ на: комментарий от Bosswik

Что мешает проверить?

awk 'BEGIN {size=0} $11 == "10.10.10.10" {size+=$6} END {printf "%.2f Mb\n", size/1000000}' test.txt 
0.48 Mb

awk 'BEGIN {counter=0} $11 == "10.10.10.10" {counter+=1} END {print counter}' test.txt 
9

Если нужно сразу оба значения за одну команду, то

awk 'BEGIN {size=0; counter=0} $11 == "10.10.10.10" {size+=$6; counter+=1} END {printf "%.2f Mb %d\n", size/1000000, counter}' test.txt 
0.48 Mb 9
Yorween ()
Ответ на: комментарий от Yorween

Еще раз большое спасибо!!! Не мог сейчас проверить так как компьютер рабочий на нем только винда.

Bosswik ()

ТС не указал ЯП. В чем проблема парсинга? Разделяющий символ - пробел, число столбцов фиксированное, но если что - скобочки у sender позволяет юстировать, если что.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от Bosswik

Тебе надо:
1.Выбрать все строки, где есть 10.10.10.10, посчитать их число. Выбрать можно с помощью grep, посчитать - wc -l:

cat log | grep 10.10.10.10 | wc -l
2. Тоже самое, только надо выделить число байт регуляркой типа received ([0-9]*) bytes. Я бы сделал на sed что-то типа
#test
echo "received 1152 bytes" | sed -rn "s/received ([0-9]*) bytes/\1/p"
или как-то так, гугли regexp groups для sed/perl/чего тебе надо. Чтобы просуммировать подойдёт bc. В итоге для задачи 2 получается следующее:
cat log | grep 10.10.10.10 | sed -rn "s/received ([0-9]*) bytes/\1+/p > sum.list
cat 0 >> sum.list
cat sum.list | bc
Первая команда собирает всё в sum.list вида 5+6+3+, вторая дописывает ноль в конец, т.к. bc не съест такую «формулу» из-за пропуска числа в конце, третья скармливает годный файл bc, который выпишет тебе результат. Работоспособность не проверял. Разбивай задачи на подзадачи, решай их по одной. Как видишь способов решения есть множество, сейчас еще напишут, что я - шмок и можно было сделать лучше.

crutch_master ★★★★★ ()
Последнее исправление: crutch_master (всего исправлений: 1)

Первое: cat simple.log | grep '10.10.10.10' | wc -l

Второе: s=0 && for i in `cat simple.log | grep '10.10.10.10' | awk '{print $6}'`;do s=`expr $s + $i`;done && echo $s

solom ()
Ответ на: комментарий от Iron_Bug

Судя по условию, это какая-то тестовая задача

solom ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.