使用php充当shell脚本(转载)
任务:过滤出2010-08-18的apache访问日志,并放到本地数据库。解决方案:写两个php文件解决这个问题
假定linux系统
假定全utf-8
假定php已经放在$PATH里
假如有这么一个日志/site/data/log/access_log_20100818,内容示例如下:
[-] [-] [] [-]
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] []
[-] [-] [?act=tuijian&id=33936] [-]
。。。。。
。。。。。
当然很大,几百M。
shell_filter.php文件内容如下:
#!/usr/local/php/bin/php
<?php
include 'CommandPublic.php'; //这是公共文件
$handle = fopen("php://stdin", "r");
//这里获得命令行参数
if (count($argv) > 1 )
$date = $argv;
else
$date = '2010-01-01';
//迭代
$j =0;
while (!feof($handle)) {
$buffer = fgets($handle);
process($buffer);
}
//关闭输入流,并结束
fclose($handle);
//筛选处理
function process($str){
global $j;
global $date;
$str = strval($str);
$str = trim($str);
$str = preg_replace('#\n|\r\n#',"", $str);
//首先要确保符合日志格式
if (preg_match('#\[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\] \[.*?\]#', $str)) {
if (!preg_match('#::1#', $str)) { //这是无用的记录
if (preg_match('#'. $date .'#', $str)) { //关键点,匹配
$j++;
echo $str . "\n"; //这里通过管道输出到下一个文件
}
}
}
}
?>
文件save_echo.php内容如下:
#!/usr/local/php/bin/php
<?php
include 'CommandPublic.php';
$db = Sys::getdb2();
$handle = fopen("php://stdin", "r");
$i=0;
while (!feof($handle)) {
$i++;
$buffer = fgets($handle);
process($buffer,$i);
}
fclose($handle);
//筛选处理
function process($str,$i=0){
global $db;
//正则截取出各字段内容
$ip = preg_replace('#^\[(.*?)\] \[.*?\] \[.*?\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[.*?\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\] \[(.*?)\]$#', '$1|$2|$3|$4|$5|$6|$7|$8|$9|$10', $str);
$arr = explode('|', $ip);
$engine_name='';
$result = array(
'ip'=> $arr,
'access_time' => $arr,
'get_post'=> $arr,
'httphost' => $arr,
'url'=> $arr,
'http_type' => $arr,
'code'=> $arr,
'length' => $arr,
'source'=> $arr,
'agent' => substr( $arr,0, 250),
'engine_name' => $engine_name,
);
$db->insert('table1', $result);
//这里只是输出到控制台给人看
echo $i .': ' .$arr.''. $arr. "\n";
}
?>
最后
进入两个php文件所在目录,
cat /site/data/log/access_log_20100812 | php shell_filter.php 2010-08-18|php save_echo.php
解释:
cat输出日志文件内容,有缓冲,机器自动处理
管道至 shell_filter.php文件的输入
shell_filter.php文件截取出2010-08-18的记录并输出,如果愿意,可以改参数为任意日期,就截取那个日期的记录
管道至 save_echo.php文件的输入
save_echo.php文件保存记录到数据库,并有控制台输出提示。
页:
[1]