FreeBSD从日志中提取数据

时间:2014-08-07 15:14:43

标签: bash unix sh freebsd

我正在编写一个脚本来从日志中获取一些结果,该日志显示访问该文件的IP地址和用户名。普通日志如下所示:

Aug  7 06:32:36 servername Apache2.4: NR443123123: client=ClientsISPname.net[192.168.1.2], Auth=LOGIN, username=MyUserName

我用它来grep IP和用户名:

grep 'username=' /var/log/mylog | grep ^[0-9,A-Z] | awk '{print $7 $9}'

它正在给我我需要的结果,但是如何在此之后只显示特定列,当前结果如下所示:

client=ClientsISPname.net[192.168.1.2], username=MyUserName
client=ClientsISPname.net[192.168.1.132], username=MyUserName1
client=ClientsISPname.net[192.168.1.5], username=MyUserName2
client=ClientsISPname.net[192.168.1.95], username=MyUserName3

我想要的是,当结果显示时,我希望仅显示IP地址和用户名,如下所示:

192.169.1.2, MyUsername
192.168.1.132, MyUsername1
192.168.1.5, MyUserName2
192.168.1.95, MyUserName3

我尝试了很多选项,但根据我的需要,我无法得到结果。

3 个答案:

答案 0 :(得分:0)

你可以用awk;

在一行中完成
awk '/username=/ {match($7, "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+"); A=substr($7, RSTART, RLENGTH); split($9, B, "="); print(A, B[1]);}' /var/log/mylog

很好地格式化awk程序

/username=/ {match($7, "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+");
             A=substr($7, RSTART, RLENGTH);
             split($9, B, "=");
             print(A, B[1]);
}

答案 1 :(得分:0)

您可以修改您的awk组件以包含一些拆分。

{
split($7,partA,']');
split(partA[1],ipaddr,'[');
split($9, partB,'=');
printf("%s, %s\n", ipaddr[1], partB[1]);
}

可能最好将其保存在文件中并使用awk -f filename

进行调用

答案 2 :(得分:0)

你可以使用perl:

cat /var/log/mylog | perl -e 'while (<>) {print $1.", ".$2."\n" if $_ =~ m/\[(.+?)\].*?username=(.+)/}'