替换Apache Log中的IP地址

时间:2014-06-01 05:24:42

标签: apache perl logging

我有以这种格式生成的apache日志:

192.168.1.125 - - [25/May/2014:03:43:10 +0000] "POST /myapp/getrequest?ip=88.125.88.88 HTTP/1.1" 200 22 "-" "11.0"

我希望将所有文件中的第一个IP换成第二个,即交换192.168.1.125和88.125.88.88。该行应如下所示:

88.125.88.88 - - [25/May/2014:03:43:10 +0000] "POST /myapp/getrequest?ip=192.168.1.125 HTTP/1.1" 200 22 "-" "11.0"

原因是:我想使用Awstats在第一列中获取IP地址的地理位置。我现在得到它的方式,我只获得我的代理服务器的IP地址。客户的IP仅是请求URL的一部分。

我的系统是Linux机器。我对Perl或sed并不擅长,但谷歌搜索,我接近:

perl -pe 's/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b -/xxxxxxxxxxx -/' access_log

我不确定要为xxxxxxxxxxx放什么。关于如何完成这项工作的任何想法?

2 个答案:

答案 0 :(得分:2)

perl -pe's/^(\S+)(\s.*?[?&]ip=)([\d.]*)/$3$2$1/' access_log

非交换版本:

perl -pe's/^\S+(\s.*?[?&]ip=([\d.]*))/$2$1/' access_log

用法:

perl -pe'...' access_log > fixed_access_log
perl -i~ -pe'...' access_log                 # Edit "in-place" with backup
perl -i -pe'...' access_log                  # Edit "in-place" without backup

答案 1 :(得分:0)

perl -wlne '$_ =~ s/((?:\d{1,3}\.){3}\d{1,3})(.*?)((?:\d{1,3}\.){3}\d{1,3})/$3$2$1/; print $_' logfile