정규식을 이용한 검색 및 파일 쓰기 in PHP
드디어 정규식을 이용한 파일 검색 및 쓰기를 완성하였다 ;-;ㅋ
C#, C++만 배울때가지만해도 PHP나 ASP는 그닥 좋은 언아가 아니라고 생각했는데
PHP는 알면 알 수록 완전 편한 언어라는걸 알게되었다..'-'d
재밌다 :) 히히
/**
* @file: SearchTRC.nwz
* @brief: DB로그파일에서 TRC찾기 :)
* @author: popo1211@neowiz.com
* @version: $Revision:
* @date: $Date:
**/
require "nwz.nwz";
$fname = "dbwolf";
$fo = fopen($fname.".txt", "r"); //dbwolf파일을 읽어옴
$login_fi = fopen($fname."_LOGIN_TRC.txt", "w"); //LOGIN_TRC를 분석, 정리한 파일
$passwd_fi = fopen($fname."_PASSWD_TRC.txt", "w"); //PASSWD_TRC를 분석, 정리한 파일
fwrite($login_fi, "MSRL\t\tNUM_IP\t\tRAW_MAC\t\tGW_MAC\t\tMAC2\r\n");
fwrite($passwd_fi, "MSRL\t\tNUM_IP\t\tMAC2\r\n");
$arrLogin = array();
$arrPasswd = array();
while($readline = fgets($fo))
{
//읽은 단어가 LOGIN_TRC라면.. / /사이에 패턴을 넣는다. 매치하는 단어를 찾음
if(preg_match("/LOGIN_TRC/", $readline))
{
$out = getLoginData($readline);
cntData(&$arrLogin, $out);
setData($login_fi, $out, "login");
}
//읽은 단어가 PASSWD_TRC라면..
if(preg_match("/PASSWD_TRC/", $readline))
{
$out = getPasswdData($readline);
cntData(&$arrPasswd, $out);
setData($passwd_fi, $out, "passwd");
}
}
fclose($fo);
fclose($login_fi);
fclose($passwd_fi);
$login_fi = fopen($fname."_LOGIN_TRC_STAT.txt", "w");
$passwd_fi = fopen($fname."_PASSWD_TRC_STAT.txt", "w");
fwrite($login_fi, "[LOGIN_TRC_STAT] \r\n");
fwrite($passwd_fi, "[PASSWD_TRC_STAT] \r\n");
//DESC sort 및 파일 쓰기 - 자동으로 sorting해주는 함수가 있다 :) 우왕굳 :)
arsort($arrLogin["MSRL"]); //asort(ASC), arsort(DESC)
arsort($arrLogin["NUM_IP"]);
arsort($arrLogin["RAW_MAC"]);
arsort($arrLogin["GW_MAC"]);
arsort($arrLogin["MAC2"]);
setArrData($login_fi, $arrLogin);
arsort($arrPasswd["MSRL"]);
arsort($arrPasswd["NUM_IP"]);
arsort($arrPasswd["MAC2"]);
setArrData($passwd_fi, $arrPasswd);
//파일 닫기
fclose($login_fi);
fclose($passwd_fi);
//LOGIN_TRC에서 IP, MAC, MSRL 등 정보를 추출하여 반환
function /* array */ getLoginData($str)
{
preg_match_all("/\(.*?\)[^,]/", $str, $arrMatch); //string에서 insert부분만 추출
/*괄호안에 있는 모든 단어를 가져온다 하지만 콤마는 제외, ?가 들어감으로써 게으른 *를 수행한다. 괄호의 쌍이 2개인 문장일 때 하나로 가져오는게 아니라 나누어 가져오는 것을 게으른이라 표현..하더라 ;^)*/
preg_match_all("/(\'(.*?)\')/", $arrMatch[0][1], $arrMatchValue); //작은 따옴표을 제외한 insert되는 값만 추출. 하위표현식에 따라 배열에 달리 저장된다.
return $arrMatchValue[2]; //하위 표현식정의에 따른 값만 반환
}
//PASSWD_TRC에서 IP, MAC, MSRL 정보를 추출하여 반환
function /* array */ getPasswdData($str)
{
preg_match_all("/\(.*?\)[^,]/", $str, $arrMatch);
preg_match_all("/\'(.*?)\'/", $arrMatch[0][1], $arrMatchValue);
return $arrMatchValue[1];
}
function cntData(&$arrRet, $arrMatch)
{
//다른 정보와의 연관없이 데이터들을 카운팅함
if(count($arrMatch) > 8 )
{
/* 여기서 또 편한 PHP, 키값이 숫자뿐만아니라 string도 된다는 것 :) 그리고 초기화하지 않아도 알아서 셋팅된다. int 인지 string인지 'ㅅ'd */
$arrRet["MSRL"][$arrMatch[0]] ++;
$arrRet["NUM_IP"][$arrMatch[4]] ++;
$arrRet["RAW_MAC"][$arrMatch[5]] ++;
$arrRet["GW_MAC"][$arrMatch[8]] ++;
$arrRet["MAC2"][$arrMatch[9]] ++;
}
else
{
$arrRet["MSRL"][$arrMatch[1]] ++;
$arrRet["NUM_IP"][$arrMatch[4]] ++;
$arrRet["MAC2"][$arrMatch[5]] ++;
}
}
function setData(&$fw, $arrMatchValue, $type)
{
if($type == "login")
$str = "{$arrMatchValue[0]}\t\t{$arrMatchValue[4]}\t\t{$arrMatchValue[5]}\t\t{$arrMatchValue[8]}\t\t{$arrMatchValue[9]}\r\n";
else
$str = "{$arrMatchValue[1]}\t\t{$arrMatchValue[4]}\t\t{$arrMatchValue[5]}\r\n";
fwrite($fw, $str);
}
function setArrData(&$fw, $arrData)
{
foreach($arrData as $index=>$value)
{
fwrite($fw, "===========$index========== \r\n");
$cnt = 0;
foreach($value as $k=>$v)
{
fwrite($fw, "$cnt: $k : $v \r\n");
$cnt++;
if($cnt > 9) //10위까지만 보여주긔~
break;
}
}
}
?>