处理日志以修复格式错误的IP地址?。?。?。x

时间:2010-03-08 15:50:32

标签: python perl bash string shell

我想使用shell脚本在日志文件的每一行上用“ 7 ”替换第一个字符“ x ”。日志文件示例:

216.129.119.x [01/Mar/2010:00:25:20 +0100] "GET /etc/....
74.131.77.x [01/Mar/2010:00:25:37 +0100] "GET /etc/....
222.168.17.x [01/Mar/2010:00:27:10 +0100] "GET /etc/....

我谦卑的开始......

#!/bin/bash
echo Starting script...
cd /Users/me/logs/
gzip -d /Users/me/logs/access.log.gz
echo Files unzipped...
echo I'm totally lost here to process the log file and save it back to hd...

exit 0

为什么日志文件IP格式错误?我的网络提供商(1和1)决定不存储IP地址,因此他们用字符“x”替换了最后一个数字。他们告诉我这是“法律”的新要求。我个人认为这是bs,但这会让我们脱离主题。

我想用AWstats处理这些日志文件,所以我需要一个没有格式化的IP地址。我想用 7 替换 x ,如下所示:

216.129.119.7 [01/Mar/2010:00:25:20 +0100] "GET /etc/....
74.131.77.7 [01/Mar/2010:00:25:37 +0100] "GET /etc/....
222.168.17.7 [01/Mar/2010:00:27:10 +0100] "GET /etc/....

我知道并不完美,但至少我可以处理文件,我仍然可以获得很多有用的信息,如国家,访问者数量等。日志文件各200MB,所以我认为shell脚本是要走的路,因为我可以在我的Macbook Pro本地快速完成。不幸的是,我对shell脚本知之甚少,而且这次我的javascript技能不会削减它。感谢您的帮助。

5 个答案:

答案 0 :(得分:3)

因为每个人都在发布他们的替代解决方案,我将发布一个我认为非常简单的解决方案:

sed s/\.x/\.7/ input_file > output_file

将任何字符串“.x”替换为“.7”

希望它有所帮助! :)

答案 1 :(得分:2)

以下perl单行应该可以解决问题:

perl -p -i -e 's/\.x/\.7/' foo.log

它会在日志文件的每一行上用'。''替换第一个'.x'实例。

答案 2 :(得分:2)

虽然我不知道在每个IP中放置“7”的目的是什么,因为这是不准确的,但是,这里是一个awk单行

$ awk '{sub(/x$/,7,$1)}1' file
216.129.119.7 [01/Mar/2010:00:25:20 +0100] "GET /etc/....
74.131.77.7 [01/Mar/2010:00:25:37 +0100] "GET /etc/....
222.168.17.7 [01/Mar/2010:00:27:10 +0100] "GET /etc/....

答案 3 :(得分:0)

你可以使用这个小小的python脚本(可能用比这更少的行编写):

import sys
for line in sys.stdin:
    ip_number, rest = line.split(' ', 1)
    ip_parts = ip_number.split('.')
    ip_parts[3] = '7'
    ip_number = '.'.join(ip_parts)
    print ip_number, rest,

将其另存为fixip.py并执行:

cat access.log | python fixip.py > output.txt

答案 4 :(得分:0)

Python(以文件形式运行作为第一个参数):

import sys
import gzip

fin = gzip.GzipFile(sys.argv[1], 'r')
fout = gzip.GzipFile(sys.argv[1] + '.new', 'w', 9)

for line in fin:
  address, rest = line.split(' ', 1)
  prefix, node = address.rsplit('.', 1)
  fout.write('%s.7 %s' % (prefix, rest))

fin.close()
fout.close()