2015-10-22 2 views
0

У меня есть файл со следующим текстом:Perl файл разборе

1152 39.955534 138.59.102.xxx -> 172.27.37.xxx HTTP 581 HTTP/1.1 200 OK (JPEG JFIF image) 

1188 42.626056 35.183.215.xxx -> 172.27.37.xxx HTTP 474 HTTP/1.1 302 Moved Temporarily 

1214 42.661556 159.70.229.xxx -> 172.27.37.xxx HTTP 1496 HTTP/1.1 200 OK (GIF89a) 
...<truncated> 

Я пытался (неисправного) для синтаксического анализа его кода Perl ниже. Я хотел бы напечатать оба IP-адреса в строке минус мусор. Строка ниже:

perl -anle '/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ and print $&' < my_input_file 

строка выводит только первый столбец IP-адресов: 138.59.102.xxx 35.183.215.xxx 159.70.229.xxx

, но не для печати 172.27. xxx.xxx. Любая помощь приветствуется, если bash или Python работают, я не против.

+0

Вам не нужен '-a' - он позволяет * autosplit * и заполняет массив' @ F'. Также лучше всего передать файл в качестве параметра * в perl, а не нажимать его через STDIN. – Borodin

ответ

1

Нечто подобное возможно?

perl -lne 'print $& while /[0-9x]{1,3}\.[0-9x]{1,3}\.[0-9x]{1,3}\.[0-9x]{1,3}/g' my_input_file 
+0

Эта работа лучше всего. Спасибо всем и @Borodin – mh00p

0

Я не знаю Perl, но это питон способ

ifile = open('example.txt','r') 
ofile = open('output.txt','w') 
for line in ifile: 
    for ip in re.findall(r'(?:\d{1,3}\.){3}\d{1,3}',line): 
    print (ip,file = ofile) 
+0

Вам не хватает точек из вашего регулярного выражения – Borodin

+0

aaahhh whoops. У меня был уродливый, прежде чем с ним, поэтому я попытался его исправить, и, наверное, я слишком много вылез. спасибо @Borodin :) –

Смежные вопросы