[질문] Perl을 이용해서 서버스펙 매칭 프로그램을 만들고 있는데요.

skylovetoya의 이미지

안녕하세요^^

현재 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만 나오더라구요.

부족한 설명이지만 도와주시면 감사하겠습니다 ㅠㅠ

좋은 하루 되세요~

raymundo의 이미지

제가 지금 자세히 들여다볼 상황이 아니라 쓱 훑어만 봤습니다만,

마지막에 if ($logs) 요 부분이 계속 참 판정나서 출력되어 버린다는 게 질문의 요지 같은데, 당연히 while 루프 안에서 매번 $logs 를 0으로 리셋하지 않고 있으니까 한번이라도 ++가 되고 나면 그 다음부터는 계속 0보다 크니까 무조건 참이 되지요.

딱히 루프 밖에서 $logs 변수를 쓸 일이 없다면 아ㅖ my $logs=0; 이 선언 라인을 통채로 while 루프 안쪽에 두시든가 해보시죠.

좋은 하루 되세요!

skylovetoya의 이미지

말씀하신대로 적용 시켜 보았는데 이전과 같은 결과가 나오네요...

제가 좀더 자세하게 글을 적어놨어야 했는데, 죄송합니당 ㅠㅠ

제가 원하는건 파일을 오픈해서 그 파일에 내용이 만약 3라인이라면

라인별로 첫번째 내용은 5.8 두번째 내용은 5.7 세번째 5.6이라 치면

각각 매칭시킬 문자가 5.8 이라 하면 결과가

5.8 matched!
5.7 does not matched
5.6 does not matched

이렇게 출력이 되었으면 하거든요 ㅠㅠ

바쁜시간 내주셔서 감사합니다!

--

좋은 하루 되세요!

익명 사용자의 이미지

라인마다 출력하려면 printf가 while 안에 있어야지요.

raymundo의 이미지

윗분 말씀대로 printf 도 while 문 밖에 있군요. 들여쓰기가 삐뚤삐뚤해서 눈으로는 못 알아챘네요.

일단 원하시는 부분만 구현하면

# 열고
open (S_FILE, "+<$s_log_file") or die "open failed!\n";
 
while ( my $line = <S_FILE> )	# 한 줄씩 읽으면서
{
	if ( $line =~ /RedHat (\d\.\d)/ ) {  # 버전 부분만 일단 뽑아내고
		my $ver = $1;  
 
		if ( $ver eq '5.8' ) {
			print $ver, " matched!\n";
		}
		else {
			print $ver, " does not matched\n";
		}
	}
	else {
		print "can not extract version\n";
	}
}
 
close S_FILE;

이런 식일 테니까 그 다음 더 자세한 정보 출력은 여기에 끼워 넣으시면 될 것 같습니다.

좋은 하루 되세요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.