Я хотел бы заменить первый символ " x" на число " 7" в каждой строке файла журнала с помощью оболочки script. Пример файла журнала:
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-адрес, который не является искаженным. Я хочу заменить x на 7, например:
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/....
Не совершенен, я знаю, но в наименьшей степени я могу обрабатывать файлы, и я все еще могу получить много полезной информации, такой как страна, количество посетителей и т.д. Журнальные файлы по 200 Мбайт каждый, поэтому я подумал, что оболочка script это путь, потому что я могу сделать это быстро на моем Macbook Pro локально. К сожалению, я очень мало знаю о сценариях оболочки, и мои навыки javascript на этот раз не собираются сокращать. Я ценю вашу помощь.
Следующий однострочный perl должен сделать трюк:
perl -p -i -e 's/\.x/\.7/' foo.log
Он заменит первый экземпляр ".x" на ".7" в каждой строке файла журнала.
поскольку все публикуют свои альтернативные решения, я собираюсь опубликовать тот, который, по моему мнению, очень прост:
sed s/\.x/\.7/ input_file > output_file
заменить любую строку ".x" на ".7"
надеюсь, что это поможет!:)
в то время как я не знаю, в чем цель положить "7" в каждом IP, потому что это неточно, тем не менее, здесь awk one-liner
$ 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/....
255
;-)
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()
Вы можете использовать этот маленький python script (который, вероятно, может быть написан меньше в строках, чем это):
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