我有一个 Dante 袜子日志文件,并试图找到一种方法来解析获取两个部分并用分号分隔它们。
日志文件包含:
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知识会很棒。
提前感谢,
一种 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]+))
正则表达式演示
解释:
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 访问数据速率。
使用 GNUawk
及其gensub
功能,您能否尝试以下操作。
awk '
BEGIN{
regex=".*(pam.username%[^@]*).*\((.*)\)"
}
{
val=gensub(regex, "\1;\2","1",$0)
sub(/[^%]*%/,"",val)
print val
}
' Input_file