我想使用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技能不会削减它。感谢您的帮助。
答案 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()