2011-01-14 4 views
1

모두정규 표현식을 사용하여 정보를 얻으려면 perl을 사용하십시오.

나는 Perl에서 실행하는 명령의 다음 출력을 가지고 있습니다. 그러나 구성 요소와 해당 상태를 캡처하는 데만 관심이 있습니다. (즉, "구성 요소"및 "상태"열)

정규식을 사용하여이 방법에 접근하는 방법에 대해 생각 해왔다. 장래에 열에 추가 구성 요소가있을 수 있으므로 구성 요소의 이름을 알 수는 없다고 가정하고 싶습니다. 두 개의 중간 열 (process-type 또는 pid)은 신경 쓰지 않습니다.

어떤 제안이 도움이 될 것입니다.

my $ consoleStatus = opmnctl status 2>&1;

-------------------+--------------------+---------+--------- 
component   | process-type  |  pid | status 
-------------------+--------------------+---------+--------- 
serverpro   | logloaderd   |  N/A | Down 
www-daemon   | www-daemon   | 10000 | Alive 
OXQA    | oqa    | 99894 | Alive 
SDFW    | OC4X_SECURITY  | 27683 | Alive 
FTP_Servers  | HTTP_Server  | 21252 | Alive 
OID    | OID    | 27207 | Alive 
DSA    | DSA    |  N/A | Down 

감사합니다,

+0

각 열을 분할 한 다음 파이프 (|)를 사용하여 각 열을 구분하면 첫 번째 열과 마지막 열을 추출하는 것이 좋습니다. 왜 당신이 reg 특급을 사용하여 접근 해야하는 모든 특정 이유? – jRJ

+0

펄에 대한 정보를 얻었 으면 무엇을하고 싶습니까? –

답변

1

당신은 어쩌면, 펄이 처리하는 것을 단순화하기 위해 opmnctl options을 사용할 수 있습니다 파이프에

opmnctl status -noheaders -fsep '|' -fmt %cmp%sta 

내가 split을 사용하는 것이 좋습니다 것, 및 분할 필드를 구분하는 문자는 |입니다.

다음은 몇 가지 아이디어입니다. 일부 opmnctl 옵션을 사용할 수 있으면이를 단순화 할 수 있습니다.

use strict; 
use warnings; 

use Data::Dumper; 

my %component_status; 

LINE: for (split(/\n/, $consoleStatus)) { 
    # Skip the furniture in the opmnctl output 
    next LINE if m/^component\W/ || m/^-/; 

    # field 0 is the component, field 3 the status. 
    my ($component, $status) = (split(/ +\| */, $_))[0,3]; 

    $component_status{$component} = $status; 
} 

warn Dumper(\%component_status); 

결과 :

공백이없는 구성 요소 이름, 그리고 가능한 상태는 '살아'와 '아래'입니다 변경하지 않는 출력의 레이아웃을 가정
$VAR1 = { 
     'DSA' => 'Down', 
     'FTP_Servers' => 'Alive', 
     'SDFW' => 'Alive', 
     'serverpro' => 'Down', 
     'OID' => 'Alive', 
     'OXQA' => 'Alive', 
     'www-daemon' => 'Alive' 
    }; 
+0

동일한 이름의 구성 요소가있을 수 있으며이 경우에는 해시 키가 고유해야합니다. 이것에 "work-around"가 있습니까? 삽입되기 전에 키의 이름을 변경하면 아이디어가 될 수 있습니까? – sandster

+0

@sandster - 아마도 동일한 구성 요소의 인스턴스를 구별하기 위해 pid를 사용할 수 있습니까? 그렇다면 구성 요소 이름과 pid (아마 $ 구성 요소)에서 해시 키를 작성할 수 있습니다. ':'. $ pid' 또는 유사합니다. 분명히, 그렇게하려면 opmnctl 상태 출력에서 ​​pid를 추출해야합니다. –

1

, 각 라인에 맞게 주어진 정규 표현식을 사용할 수 아래

/^(\S+)\s+\|.+\|\s+(Alive|Down)$/ 

, 나는 STDIN에서 입력을 유도 할 수있는 코드를 작성, 그리고 구성 요소를 출력하며 상태입니다 :

while(<STDIN>) { 
    if($_ =~ /^(\S+)\s+\|.+\|\s+(Alive|Down)$/) { 
     print "$1 -> $2\n"; 
    } 
} 
관련 문제