LINUX.ORG.RU

tcpdump|AWK - help


0

0

С awk знаком на уровне простых операций. Задача стоит парсить tcpdump и писать в mysql, возможно даже не через буфер (написал хорошие правила для tcpdump'a). Вот такого вида пакеты:

E..6....t......b....9.)..".G................sOmEtext1. IP 00.000.00.00.0000 > 000.000.000.000.00000: UDP, length: 30 E..:l.../..;H.Ht.....W)..&A.............B...[some]text2. IP 00.0.000.0.00000 > 000.000.000.000.00000: UDP, length: 31 E..7.

..s...b..)....2.)..#. ............Va.%some-text. IP 000.00.000.0.0000 > 000.000.000.000.00000: UDP, length: 26 E..e.|..0...H.......;.)..Q........$=:H6_n}{e]0"{+3B%{^W6D+SE_W7?m"Pj#m2{337^Q}@ N)HCVk3I#?%BCFHCanT/4.

"sometext" может состоять из символов "a-z A-Z 0-9 - _" и иногда даже "." Он находится всегда в конце строки, которая может содержать перевод строки в любом виде (dos/linux). В mysql нужны две записи с одного пакета - sometext и IP (без порта) либо ни одной, если мусор (3й пакет). Мусор могу частично убрать за счет length, целые пакеты по 15-40.

пытался начинать так: awk 'BEGIN { RS = "\x45\x2E" ; FS = "IP" } { тут застрял }' всравно много мусора, все что я 100% имею это когда "E." на новой строке - новый пакет (RS) и "IP [0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" тоже всегда с новой строки, неизменного вида. Подключать perl или php не хочется.


[code]
E..6....t......b....9.)..".G................sOmEtext1.
IP 00.000.00.00.0000 > 000.000.000.000.00000: UDP, length: 30

E..:l.../..;H.Ht.....W)..&A.............B...[some]text2.
IP 00.0.000.0.00000 > 000.000.000.000.00000: UDP, length: 31
E..7.

..s...b..)....2.)..#. ............Va.%some-text.
IP 000.00.000.0.0000 > 000.000.000.000.00000: UDP, length: 26
E..e.|..0...H.......;.)..Q........$=:H6_n}{e]0"{+3B%{^W6D+SE_W7?m"Pj#m2{337^Q}@ N)HCVk3I#?%BCFHCanT/4.
[/code]

crymos
() автор топика
Ответ на: комментарий от sdio

Что tcpdump что ngrep один хрен, небольшая разница в синтаксисе. Ну чуть удобнее формат файла: awk 'BEGIN { RS = "\x23\x0A" ; FS = "\n" } { не знаю что тут писать }' поделить он поделил, а как по regexp получить текст в конце второй строки и только IP из первой я не знаю, целую книгу перерыл, не понял. Было бы хорошо объснить мне как разбивать внутри awk с указанием разных разделителей, плюс отрезать определенное количество символов в awk в начале строки (95% пакетов одного формата). Куча мусора осталась:

#
U YYYYYYYYYYYYY:XXX -> XXXXXXXXXXXXXXX:XXXXX
..............a
#
U YYYYYYYYYYYYY:XXXXX -> XXXXXXXXXXXXXXX:XXXXX
.............,J.YYYYYYYYYY.
#
U XXXXXXXXXXXXXX:XXXXX -> XXXXXXXXXXXXXXX:XXXXX
d1:ad2:id20:d.q+L,8..|s...X?sS.Re1:q4:ping1:t8:..<..^<.1:y1:qe

YYYYY - то что нужно, XXXX - замазано, не нужно. "Неправильный" пакет, правильный, мусор.

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

>Было бы хорошо объснить мне как разбивать внутри awk с указанием разных разделителей,

split($2, a, ":") -- разбить второе поле ($2) по разделителю ":" -- результат в массиве `a` (a[1], a[2], ...)

>плюс отрезать определенное количество символов в awk в начале строки


substr(s, i [, n]) -- s -строка, i - старт индекс, n -- кол-во символов

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