#1 01.07.10 21:19
[perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
не могу понять экранируются ли ковычки в линкусе. нужно извлечь строки удовлетворяющие одному из условий, делаю так
Код: perl:
#!/usr/bin/perl my $ok = 20; my $patern1='"GET / HTTP/1.1" 200 582 "-" "Opera/9.02 (Windows NT 5.1; U; ru)"'; #my $patern2='"GET / HTTP/1.1" 200 582 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1"'; @iplist = `cat /var/log/nginx/access.log | grep '$patern2' | awk '{print \$1}' | sort -u`; // выдёргиваем айпи попавшие под условия for (@iplist) { chop; #$ip = $_; $num = `cat /var/log/nginx/access.log | grep '$_' | wc -l | awk '{print \$1}'`; //считаем сколько раз айпи встречается в логе #print "-$num\n"; if($num > $ok) { #print "$_ $num - ban\n"; system("/sbin/ipfw table 4 add $_"); # adding address to table 5 } } system("echo '' > /var/log/nginx/access.log"); # чисти лог веб сервера system("/sbin/ipfw table 4 list > /usr/src/flood_ip.txt") # сохраняем айпи
как в греп включить $patern2 ?
Исправлено qwas3 (01.07.10 21:20)
Offline
#2 01.07.10 21:50
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
my $pattern2 = "\'blah blah blah\'";
@iplist = `cat /var/log/nginx/access.log | grep $pattern2 | awk '{print \$1}' | sort -u`;
Хотя у меня и так заработало:
my $pattern2 = "blah blah blah";
@iplist = `cat /var/log/nginx/access.log | grep '$pattern2' | awk '{print \$1}' | sort -u`;
Или вопрос был в ["] внутри pattern2? Просто \ перед ними поставить да и всё.
Думайте проще=)
Исправлено Com[N-Line] (01.07.10 21:55)
Offline
#4 02.07.10 11:49
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
@iplist = `cat file | grep '$pattern1\|$pattern2' | awk ... | sort -u`;
Исправлено Com[N-Line] (02.07.10 11:56)
Offline
#6 02.07.10 13:19
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
переделал, работает
Код: perl:
#!/usr/bin/perl my $ok = 20; my $p1='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Opera\/9\.02 \(Windows NT 5\.1\; U\; ru\)\"'; my $p2='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/5\.0 \(Windows\; U\; Windows NT 5\.1\; ru\; rv\:1\.8\.1\.1\) Gecko\/20061204 Firefox\/2\.0\.0\.1\"'; my $p3='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/4.0 \(compatible\; MSIE 6.0\; Windows NT 5.1\; SV1\; \.NET CLR 1\.1\.4322\)\"'; my $logfile = '/var/log/nginx/access.log'; @iplist = `cat '$logfile' | grep -E '($p1|$p2|$p3)' | awk '{print \$1}' | sort -u`; ...
Исправлено qwas3 (02.07.10 13:19)
Offline
#7 02.07.10 14:13
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
qwas3 написал(а):
переделал, работает
Код: perl:
#!/usr/bin/perl my $ok = 20; my $p1='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Opera\/9\.02 \(Windows NT 5\.1\; U\; ru\)\"'; my $p2='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/5\.0 \(Windows\; U\; Windows NT 5\.1\; ru\; rv\:1\.8\.1\.1\) Gecko\/20061204 Firefox\/2\.0\.0\.1\"'; my $p3='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/4.0 \(compatible\; MSIE 6.0\; Windows NT 5.1\; SV1\; \.NET CLR 1\.1\.4322\)\"'; my $logfile = '/var/log/nginx/access.log'; @iplist = `cat '$logfile' | grep -E '($p1|$p2|$p3)' | awk '{print \$1}' | sort -u`; ...
Я думаю проверок на юзерагент в перле есть и без велосипеда и к тому же в одну строчку.
Offline
#8 02.07.10 17:12
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
qwas3 написал(а):
Com[N-Line написал(а):
]'$pattern1\|$pattern2'
не ищет
А у меня ищет :P
Offline
#10 03.07.10 17:52
#11 05.07.10 13:56
#12 28.08.10 22:19
Re: [perl&grep] извлечь две подстроки из строки. в подстроке есть ковычки
qwas3 написал(а):
переделал, работает
Код: perl:
#!/usr/bin/perl my $ok = 20; my $p1='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Opera\/9\.02 \(Windows NT 5\.1\; U\; ru\)\"'; my $p2='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/5\.0 \(Windows\; U\; Windows NT 5\.1\; ru\; rv\:1\.8\.1\.1\) Gecko\/20061204 Firefox\/2\.0\.0\.1\"'; my $p3='\"GET \/ HTTP\/1\.1\" 200 582 \"\-\" \"Mozilla\/4.0 \(compatible\; MSIE 6.0\; Windows NT 5.1\; SV1\; \.NET CLR 1\.1\.4322\)\"'; my $logfile = '/var/log/nginx/access.log'; @iplist = `cat '$logfile' | grep -E '($p1|$p2|$p3)' | awk '{print \$1}' | sort -u`; ...
Смесь носорога с педагогом.
зачем тебе в коде перла использовать строку
Код::
@iplist = `cat '$logfile' | grep -E '($p1|$p2|$p3)' | awk '{print \$1}' | sort -u`;когда в нем есть свой regex более мощный чем в bash.
Offline

