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

1

Я хотел бы заменить первый символ " 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 на этот раз не собираются сокращать. Я ценю вашу помощь.

Теги:
string

5 ответов

2
Лучший ответ

Следующий однострочный perl должен сделать трюк:

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

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

  • 1
    ты не должен избежать точки?
  • 0
    должен был и сделал. но мне нужно было дважды убежать от него, чтобы правильно появиться в посте. спасибо за указатель
Показать ещё 1 комментарий
3

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

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

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

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

2

в то время как я не знаю, в чем цель положить "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/....
  • 0
    Цель поставить 7 в конце каждого IP-адреса состоит в том, что мой провайдер удалил последнюю часть IP-адреса и поставил x на месте. Я думаю, что большинство интернет-провайдеров имеют блоки по 256 для своих клиентов. Шансы посетителей из одной и той же страны из одной и той же серии интернет-провайдеров невелики. 216.129.119.7 происходит из той же страны, что и 216.129.119.38, в данном случае США. Мне нравится число 7, оно так же хорошо, как и любой другой номер, который я мог бы использовать? ;)
  • 0
    @skymook Я бы выбрал 255 ;-)
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()
0

Вы можете использовать этот маленький 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
  • 0
    Несмотря на то, что я использовал правильную команду "cat access.log | python fixip.py", этот вывод выводился на мой терминал, а не в файл, который мне нужен.
  • 0
    В Unix, где «все является файлом», вы можете перенаправить вывод непосредственно в файл с помощью директивы «>». Я обновлю команду выше.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню