Как разобрать файл журнала Dante

У меня есть файл журнала dante socks, и я пытаюсь разобрать две части и разделить их точкой с запятой.

Файл журнала содержит:

Sep 11 03:02:00 (1568505720.145620) danted[10402]: info: pass(2): tcp/connect -: pam.username%MyUsername@46.111.111.250.48198 123.12.12.112.1080 -> 123.12.12.112.48198 111.123.123.147.443 (319721)
Sep 11 03:02:00 (1568505720.147471) danted[10402]: info: pass(2): tcp/connect -: pam.username%MyUsername@46.111.111.250.37449 123.12.12.112.1080 -> 123.12.12.112.37449 123.123.123.211.443 (312)
Sep 11 03:02:00 (1568505720.148240) danted[10402]: info: pass(2): tcp/connect -: 111.123.123.147.443 123.12.12.112.48198 -> 123.12.12.112.1080 pam.username%MyUsername@46.111.111.250.48198 (723)
Sep 11 03:02:00 (1568505720.154784) danted[10402]: info: pass(2): tcp/connect -: 123.123.123.211.443 123.12.12.112.37449 -> 123.12.12.112.1080 pam.username%MyUsername@46.111.111.250.37449 (8831)

По сути, я хочу получить после pam.username% для выборки имя пользователя и скорость передачи данных внутри двух круглых скобок, например 8831, так что в итоге получится что-то вроде ниже:

MyUsername;319721
MyUsername;312
MyUsername;723
MyUsername;8831

Я думаю, что на этом этапе было бы здорово знать awk и sed / regex.

Заранее спасибо,

3 ответа

Путь на perl:

perl -ane 's/^.+?pam\.username%([^@]+).+?\((\d+).*$/$1;$2/;print' file.log
MyUsername;319721
MyUsername;312
MyUsername;723
MyUsername;8831

Попробуйте использовать следующее регулярное выражение:

pam\.username%([A-Za-z0-9]+)@|\s\(([0-9]+)\)

Демо Regex

Пояснение:

pam\.username%([A-Za-z0-9]+)@  # Match any A-Za-z0-9 between pam.username% and @ - Group 1
|                              # Or
\s\(([0-9]+)\)         # Match any digits between parenthesis following a whitespace - Group 2

Получите доступ к имени пользователя через группу 1 и скорости передачи данных через группу 2.

Использование GNU awkа также gensub функция этого, не могли бы вы попробовать следующее.

awk '
BEGIN{
  regex=".*(pam.username%[^@]*).*\\((.*)\\)"
}
{
  val=gensub(regex, "\\1;\\2","1",$0)
  sub(/[^%]*%/,"",val)
  print val
}
'  Input_file
Другие вопросы по тегам