我有以这种格式生成的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放什么。关于如何完成这项工作的任何想法?
答案 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