[질문] Perl을 이용해서 서버스펙 매칭 프로그램을 만들고 있는데요.
안녕하세요^^
현재 Perl을 이용해서 서버스펙 매칭 프로그램을 만들고 있습니다.
로직은
ip를 입력 하면 마스터 서버 정보가 출력이 되고,(log저장이 됩니다)
다음 슬레이브 서버 ip를 입력하면 슬레이브 서버 정보를 출력을 해줘야 하는데
정보를 출력 하기전에
슬레이브 서버 정보를 log에 저장을 한후,
그 logfile에 있는 정보를 정규식표현 으로 매칭을 시켜서 출력을 해주는 방식입니다.
(log vs log매칭을 할려 했는데 맨윗줄만 체크하고 그 부분이 참이면 나머지 정보들도 전부 참으로 인식을해서 안돼던구요)
우선 코드는(슬레이브 서버 출력 코드)
open my $s_log, '>>', $s_log_file; printf $s_log("%-20s @snet_d:%-16s(@s_ethtool) RedHat %-s%-15s %-5s %-sGB(%-sGB)\n","@s_host","@s_ip","@s_os","@s_arc","@s_cpu","@s_mem","@s_swap"); close $s_log; ## Match open (S_FILE, "+<$s_log_file") or die "open failed!\n"; my $logs=0; while (my $line =<S_FILE> ) { substr($line, 43); if ( $line =~ /5.8/mi ){ $logs++; } } if($logs) { printf ("%-20s @snet_d:%-16s(@s_ethtool) RedHat %-s%-15s %-5s %-sGB(%-sGB) Matched!\n","@s_host","@s_ip","@s_os","@s_arc","@s_cpu","@s_mem","@s_swap"); }else{ printf ("%-20s @snet_d:%-16s(@s_ethtool) RedHat %-s%-15s %-5s %-sGB(%-sGB) Does Not Matched!\n","@s_host","@s_ip","@s_os","@s_arc","@s_cpu","@s_mem","@s_swap"); } close (S_FILE); } close $snoarch; }
이런식인데
$line에 슬레이브 출력정보가 저장되어있으며, =~ /5.8/ (레드햇 OS버젼)같은 정규식 표현으로
참이면 Matched 출력문이 나오며, 맞지 않는다면 Does Not Matched출력문이 보여 지게 됩니다.
문제는 로그 저장이 아래와 같이 되며
hostname1 bond0:192.168.0.1 (1000Mb/s) RedHat 5.8 x86_64 E5620@2.40GHz 24GB(2GB)
hostname2 bond0:192.168.0.2 (1000Mb/s) RedHat 5.7 x86_64 E5620@2.40GHz 24GB(1GB)
hostname3 bond0:192.168.0.3 (1000Mb/s) RedHat 5.7 x86_64 E5620@2.40GHz 24GB(1GB)
이 로그에서 hostname별로 출력을 해주고 싶은데 그게 안돼네요.
맨 윗줄만 체크하고 그부분이 참이면 전부 Matched만 나오더라구요.
부족한 설명이지만 도와주시면 감사하겠습니다 ㅠㅠ
좋은 하루 되세요~
제가 지금 자세히 들여다볼 상황이 아니라 쓱 훑어만
제가 지금 자세히 들여다볼 상황이 아니라 쓱 훑어만 봤습니다만,
마지막에 if ($logs) 요 부분이 계속 참 판정나서 출력되어 버린다는 게 질문의 요지 같은데, 당연히 while 루프 안에서 매번 $logs 를 0으로 리셋하지 않고 있으니까 한번이라도 ++가 되고 나면 그 다음부터는 계속 0보다 크니까 무조건 참이 되지요.
딱히 루프 밖에서 $logs 변수를 쓸 일이 없다면 아ㅖ my $logs=0; 이 선언 라인을 통채로 while 루프 안쪽에 두시든가 해보시죠.
좋은 하루 되세요!
안녕하세요 레이문도님!
말씀하신대로 적용 시켜 보았는데 이전과 같은 결과가 나오네요...
제가 좀더 자세하게 글을 적어놨어야 했는데, 죄송합니당 ㅠㅠ
제가 원하는건 파일을 오픈해서 그 파일에 내용이 만약 3라인이라면
라인별로 첫번째 내용은 5.8 두번째 내용은 5.7 세번째 5.6이라 치면
각각 매칭시킬 문자가 5.8 이라 하면 결과가
5.8 matched!
5.7 does not matched
5.6 does not matched
이렇게 출력이 되었으면 하거든요 ㅠㅠ
바쁜시간 내주셔서 감사합니다!
--
좋은 하루 되세요!
라인마다 출력하려면 printf가 while 안에
라인마다 출력하려면 printf가 while 안에 있어야지요.
윗분 말씀대로 printf 도 while 문 밖에
윗분 말씀대로 printf 도 while 문 밖에 있군요. 들여쓰기가 삐뚤삐뚤해서 눈으로는 못 알아챘네요.
일단 원하시는 부분만 구현하면
이런 식일 테니까 그 다음 더 자세한 정보 출력은 여기에 끼워 넣으시면 될 것 같습니다.
좋은 하루 되세요!
댓글 달기