我正在编写一个脚本来从日志中获取一些结果,该日志显示访问该文件的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
我尝试了很多选项,但根据我的需要,我无法得到结果。
答案 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=(.+)/}'