2010-03-08 42 views
1

我想用一个shell在日志文件的每一行上用''替换第一个字符'x''脚本。日志文件示例:处理日志以修复格式错误的IP地址?。?。?。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畸形这样吗?我的网络提供者(1and1)决定不存储IP地址,所以他们用字符'x'替换了最后一个数字。他们告诉我这是'法律'的新要求。我个人认为这是bs,但那会让我们脱离主题。

我想用AWstats处理这些日志文件,所以我需要一个不会格式错误的IP地址。我想用一个更换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技能不会在这次减少。我感谢您的帮助。

回答

2

下面的Perl的一行应该做的伎俩:

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

它会替代与日志文件中的每一行” 0.7' “.X”的第一个实例。

+1

你不应该逃脱点吗? – 2010-03-09 01:15:34

+0

应该有和做过。但我需要双倍转义才能正确显示在帖子中。感谢您的指针 – seejay 2010-03-09 07:07:10

+0

这工作得很好。我确实尝试了所有的解决方案,但是这很快并且直接安装在我的脚本中。它在25秒内完成了240MB的日志。 – skymook 2010-03-09 13:04:22

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 
+0

即使我使用了正确的命令“cat access”。日志| Python的fixip.py“输出到我的终端,而不是我需要的文件 – skymook 2010-03-09 11:46:58

+0

在Unix中,”一切都是文件“,所以你可以通过”>“指令将输出直接重定向到一个文件中, – mojbro 2010-03-12 10:26:58

+0

感谢您的更新 – skymook 2010-03-12 13:07:55

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/.... 
+0

把7放在每个IP末尾的目的是因为我的ISP已经删除了IP的最后一部分并且放置了一个x. 我认为最互联网服务提供商将为他们的客户提供256个块,同一国家的访问者来自同一个ISP块范围的可能性很小,216.129.119.7确实来自同一国家,即216.129.119.38,在美国是这样的。 7号,这是我可以使用的任何其他号码一样好;) – skymook 2010-03-09 11:31:04

+0

@skymook我会选择'255' ;-) – 2010-03-09 15:28:27

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() 
3

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

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

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

希望它有帮助! :)