Обработка журнала для исправления неверно сформированного IP-адреса?.?.?. X - PullRequest
1 голос
/ 08 марта 2010

Я хотел бы заменить первый символ ' x ' числом ' 7 ' в каждой строке файла журнала, используя сценарий оболочки. Пример файла журнала:

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 на 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 МБ каждый, поэтому я подумал, что сценарий оболочки путь, потому что я могу сделать это быстро на моем MacBook Pro на месте. К сожалению, я очень мало знаю о сценариях оболочки, и мои навыки работы с javascript на этот раз не помогут. Я ценю вашу помощь.

Ответы [ 5 ]

3 голосов
/ 09 марта 2010

, так как все публикуют свои альтернативные решения, я собираюсь опубликовать одно, которое я считаю очень простым:

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

заменить любую строку ".x" на ".7"

надеюсь, это поможет! :)

2 голосов
/ 09 марта 2010

пока я не знаю, для чего нужно ставить «7» в каждом IP-адресе, потому что это неточно, тем не менее, вот одна строка в 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/....
2 голосов
/ 08 марта 2010

Следующая однострочная команда perl должна сделать трюк:

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

Он заменит первый экземпляр «.x» на «.7» в каждой строке файла журнала.

0 голосов
/ 09 марта 2010

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()
0 голосов
/ 08 марта 2010

Вы можете использовать этот маленький скрипт на 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
...