всем приветнужен php скрипт который выводит в 1 строчку данные
есть файл такого планаNov 5 11:25:14 ivan-desktop pppd[2830]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
Nov 5 11:25:14 ivan-desktop pppd[2830]: pptpd-logwtmp: $Version$
Nov 5 11:25:14 ivan-desktop pppd[2830]: pppd options in effect:
Nov 5 11:25:14 ivan-desktop pppd[2830]: debug#011#011# (from /etc/ppp/pptpd-options)
Nov 5 11:25:16 ivan-desktop pppd[2830]: local IP address 192.168.10.2
Nov 5 11:25:16 ivan-desktop pppd[2830]: remote IP address 192.168.10.1
Nov 5 11:25:16 ivan-desktop pppd[2830]: pptpd-logwtmp.so ip-up ppp0 Ivan 192.168.10.5
Nov 5 11:25:28 ivan-desktop pppd[2830]: LCP terminated by peer (OIm^E^@<M-Mt^@^@^@^@)
Nov 5 11:25:28 ivan-desktop pppd[2830]: pptpd-logwtmp.so ip-down ppp0
Nov 5 11:25:28 ivan-desktop pppd[2830]: Connect time 0.2 minutes.
Nov 5 11:25:28 ivan-desktop pppd[2830]: Sent 229 bytes, received 3131 bytes.
Nov 5 11:25:28 ivan-desktop pppd[2830]: Modem hangup
Nov 5 11:25:28 ivan-desktop pppd[2830]: Connection terminated.
Nov 5 11:25:29 ivan-desktop pppd[2830]: Exit.Из него необходимо вывести
1 время старта, это время взять из строки Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
2 имя пользователя и ИП машины, это взять из pptpd-logwtmp.so ip-up ppp0 Ivan 192.168.10.5
3 время конца, это время взять из строки pptpd-logwtmp.so ip-down ppp0
>[оверквотинг удален]
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Connect time 0.2 minutes.
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Sent 229 bytes, received 3131 bytes.
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Modem hangup
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Connection terminated.
> Nov 5 11:25:29 ivan-desktop pppd[2830]: Exit.
> Из него необходимо вывести
> 1 время старта, это время взять из строки Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
> 2 имя пользователя и ИП машины, это взять из pptpd-logwtmp.so ip-up ppp0
> Ivan 192.168.10.5
> 3 время конца, это время взять из строки pptpd-logwtmp.so ip-down ppp0<?php
$file = "/tmp/file";
$fp = fopen ( $file, "r" ) or die ( "Couldn't open $file" );while ( ! feof ( $fp ) ) {
$line = fgets ( $fp, 1024 );
if ( preg_match ( '|Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded|', $line ) ) { preg_match ( '/\d{2}:\d{2}:\d{2}/', $line, $start ); }
if ( preg_match ( '|pptpd-logwtmp.so ip-up ppp|', $line ) ) { preg_match ( '/(^.*ppp\d+\s)([a-zA-Z]*)\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/', $line, $array ); }
if ( preg_match ( '|pptpd-logwtmp.so ip-down ppp|', $line ) ) { preg_match ( '/[0-9]{2}:[0-9]{2}:[0-9]{2}/', $line, $stop ); }
}print $start = $start[0];
print $name = $array[2];
print $ip = $array[3];
print $stop = $stop[0];?>
Для строгой проверки регулярка IP не совсем правильная, но для "выдирания" сгодится
Возьмите на perl#!/usr/bin/perl
use strict;
use warnings;my ($start, $name, $ip, $stop);
my $file = "/tmp/file";open ( FH, $file ) or die "couldn't open $file : $!";
while ( <FH> ) {
chomp;
if ( m|Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded| ) { s/^.*(\d{2}:\d{2}:\d{2}).*$/$1/; $start = $1; }
if ( m|pptpd-logwtmp.so ip-up ppp| ) { s/^.*ppp\d+\s([a-zA-Z]*)\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/$1$2/; $name = $1; $ip = $2; }
if ( m|pptpd-logwtmp.so ip-down ppp| ) { s/^.*(\d{2}:\d{2}:\d{2}).*$/$1/; $stop = $1; }
}
close FH;print $start, $name, $ip, $stop;
Попробуйте, вам понравится! ))
>[оверквотинг удален]
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Connect time 0.2 minutes.
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Sent 229 bytes, received 3131 bytes.
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Modem hangup
> Nov 5 11:25:28 ivan-desktop pppd[2830]: Connection terminated.
> Nov 5 11:25:29 ivan-desktop pppd[2830]: Exit.
> Из него необходимо вывести
> 1 время старта, это время взять из строки Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
> 2 имя пользователя и ИП машины, это взять из pptpd-logwtmp.so ip-up ppp0
> Ivan 192.168.10.5
> 3 время конца, это время взять из строки pptpd-logwtmp.so ip-down ppp0man last
Спасибо примеры работают. А если файл выглядит следующим образомNov 6 10:18:47 ivan-desktop pppd[1784]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
**************************************************************************************
Nov 6 10:18:49 ivan-desktop pppd[1784]: pptpd-logwtmp.so ip-up ppp0 Ivan 192.168.10.5
Nov 6 10:19:12 ivan-desktop pppd[1820]: Plugin /usr/lib/pptpd/pptpd-logwtmp.so loaded.
**************************************************************************************
Nov 6 10:19:16 ivan-desktop pppd[1820]: pptpd-logwtmp.so ip-up ppp1 User 192.168.1.101
Nov 6 10:20:00 ivan-desktop pppd[1820]: pptpd-logwtmp.so ip-down ppp1
Nov 6 10:20:01 ivan-desktop pppd[1820]: Exit.
Nov 6 10:21:32 ivan-desktop pppd[1784]: pptpd-logwtmp.so ip-down ppp0
Nov 6 10:21:32 ivan-desktop pppd[1784]: Exit.то выводится последние время старта и последние время закрытия соединения.
Т.е. есть 1 пользователь подключился (Ivan), потом подключился еще 1 пользователь (User), вначале отключился 2 пользователь, потом первый.
скрипт вывел
10:19:12 User 192.168.1.101 10:21:32а нужно
10:18:47 Ivan 192.168.10.5 10:21:32
10:19:12 User 192.168.1.101 10:20:00Помогите если не трудно, а то я с этим месяц разбираться буду
Я же говорю, возьмите на perl#!/usr/bin/perl
use strict;
use warnings;my ( @data, @array, %stat_user );
my ( $start, $iface, $num, $name, $ip, $stop, $i );
my $max = 0;
my $file = "/tmp/file";open ( FH, $file ) or die "couldn't open $file : $!";
while ( <FH> ) {
chomp;
push @data, $_;if ( /ip-up ppp(\d*)/ ) { $max = $1 if $1 > $max; }
}close FH;
for ( $i = 0; $i <= $max; $i ++ ) {
foreach ( @data ) {
if ( /ip-up ppp$i/ ) {
/^.*(\d{2}:\d{2}:\d{2}).*\s(ppp($i))\s([a-zA-Z0-9]*)\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/;
$start = $1; $iface = $2; $num = $3; $name = $4; $ip = $5;@{$array["$i"]} = ("$start", "$name", "$ip") if defined($3);
}if ( /ip-down ppp$i/ ) { /^.*(\d{2}:\d{2}:\d{2}).*\s(ppp($i))$/;
$stop = $1; $iface = $2; $num = $3;
push @{$array[$i]}, $stop if defined($3);
}}
}
for my $arrayref (@array) {
print join (" ", @{$arrayref} ), "\n" if defined ( length $arrayref );
}
Михалыч, спасибо тебе огромное!
Что-то я намудрил в предыдущем посте.
Это как не надо делать. ))
Всё оказалость гораздо проще. Может ещё пригодится.На perl
#!/usr/bin/perl
use strict;
use warnings;my @array;
my $file = "/tmp/file";open ( FH, $file ) or die "couldn't open $file : $!";
while ( <FH> ) {
chomp;if ( /ip-up ppp\d+/ ) {
/^.*(\d{2}:\d{2}:\d{2}).*\s(ppp(\d+))\s([a-zA-Z0-9]*)\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/;
push @{$array[$3]}, "$1 $4 $5";
}if ( /ip-down ppp\d+/ ) {
/^.*(\d{2}:\d{2}:\d{2}).*\s(ppp(\d+))$/;
push @{$array[$3]}, $1;
}}
close FH;
for my $arrayref (@array) {
print join (" ", @{$arrayref} ), "\n" if defined ( length $arrayref );
}
На php<?php
$file = "/tmp/file";
$fp = fopen ( $file, "r" ) or die ( "Couldn't open $file" );while ( ! feof ( $fp ) ) {
$line = fgets ( $fp );if ( preg_match ( '/ip-up ppp\d+/', $line ) ) {
preg_match ( '/^.*(\d{2}:\d{2}:\d{2}).*(ppp(\d+))\s([a-zA-Z0-9]*)\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/', $line, $logon );$ifaces[$logon[3]] = array($logon[1], $logon[4], $logon[5]);
}if ( preg_match ( '/ip-down ppp\d+/', $line ) ) {
preg_match ( '/^.*(\d{2}:\d{2}:\d{2}).*(ppp(\d+))$/', $line, $logoff );array_push($ifaces[$logoff[3]], $logoff[1]);
}
}foreach ( $ifaces as $iface ) {
foreach ( $iface as $val ) {
print $val . " ";
}
print "\n";
}?>
Массивчик распотрошить на php а-ля perlforeach ( $ifaces as $iface ) {
print implode ( " ", $iface ) . "\n";
}