2012-01-02 2 views
-2

명령의 출력에 나오는 특정 단어 (C7STH, C7ST2C)의 '번호'를 찾아야합니다. 이 명령은 '고정 된'텍스트로 시작하고 끝납니다. 아래에서와 같이 START & END를 시작하십시오. 이 명령은 로그 파일의 다른 노드에 대해 여러 번 반복됩니다. (/^START을 $/.../^ END을 $ /) 각 명령의 출력을 얻을 경우Perl에서는 플립 플롭 연산자를 사용하여 직접 캡처 한 데이터에 'grep'명령을 적용 할 수 있습니까?

...

START 
SLC ACL PARMG ST     SDL        SLI 
0 A1 17 C7STH-1&&-31   MSC19-0/RTLTB2-385 
1 A1 17 C7STH-65&&-95  MSC19-0/RTLTB2-1697 

SLC ACL PARMG ST     SDL        SLI 
0 A2 0 C7ST2C-4    ETRC18-0/RTLTB2-417 
1 A2 0 C7ST2C-5    ETRC18-0/RTLTB2-449 
2 A2 0 C7ST2C-6    ETRC18-0/RTLTB2-961 
... 
END 

....

I는 (플립 플롭 연산자를 사용하고 . 이제

  1. 은 줄 단위로 이동하지 않고이 데이터를 '그렙'를 할 수있는 방법이 있나요?처럼 내가 '그렙'를 배열로 'START'와 'END'사이의 모든 텍스트를 얻을 할 수 이쪽에?

  2. 또한 성능 측면에서 볼 때 플립 플롭 연산자를 사용하여 if 블록을 여러 수준으로 유지하는 것이 좋습니다. 당신이 코드 예제를 제공하지 않기 때문에 (

    my $number = grep {/particular word/} grep {/START/../END/} <>; 
    

    난에 인수로 전달되는 다이아몬드 연산자를 사용하여 로그 파일을 가정했습니다

+0

견본을 제공해 주시겠습니까? – Zaid

+0

관련 질문 : http : // stackoverflow.co.kr/q/8273383/133939 – Zaid

+0

Zaid : 어떻게 그렇게됩니까? 나는 'START'와 'END'사이의 텍스트가 임의의 수의 줄이라고 가정합니다. – flesk

답변

1

을 어쩌면 당신이 라인을 따라 뭔가를 찾고 :

#!/usr/bin/env perl 
use strict; 
use warnings; 
my $word = q(stuff); 
my @data; 
while (<DATA>) { 
    if (/^START/../^END/) { 
     chomp; 
     push @data, $_ unless /^(?:START|END)/; 
    } 
    if (/^END/) { 
     my $str = "@data"; 
     print +(scalar grep {/$word/} (split//,$str)), 
      " occurances of '$word'\n"; 
     @data =();  
    } 
} 
__DATA__ 
this is a line 
START of my stuff 
more my stuff 
and still more stuff 
and lastly, yet more stuff 
END of my stuff 
this is another line 
START again 
stuff stuff stuff stuff 
yet more stuff 
END again 

... 이는 것 출력 :

3 occurances of 'stuff' 
5 occurances of 'stuff' 
+0

도움을 많이 주셔서 감사 드리며 샘플 코드를 예제로 제공하여 주셔서 감사합니다. 배열에 행을 넣는 것은 그 배열에서 다른 단어를 검색해야하므로 내 목적에 맞습니다. 하지만 코딩 스타일을 이해하는 것은 나 같은 초보자에게는 힘들었습니다. :) 정규식에서 (? : START | END)와 같은 패턴을 사용하는 특별한 이유가 있습니까? 또한 배열을 문자열로 변환 한 다음 두 번 나누면 되나요 ?? – pkr13

+0

@ pkr13 : 패턴/^ (?: START | END)/패턴이 줄의 시작 부분에 고정되어 있으면 START 또는 END (변경)와 일치합니다. ? : 불필요한 오버 헤드가 될 수있는 캡처를 끕니다. 괄호가 없으면 패턴은/^ START |^END/- less readable IMHO로 작성되어야합니다. 배열 - 문자열 변환은 분할을 허용하기 위해 수행되었습니다. 이 기능은 한 줄 내의 여러 패턴 일치를 하나의 일치 항목 이상으로 계산할 수 있도록 설계되었습니다. – JRFerguson

4

이것은 간단한 해결책이 될 것입니다 스크립트. 필요한 경우 파일 핸들로 바꾸십시오.)

grep {/START/../END/} <>은 구분 기호 안에 포함 된 요소 목록을 만들고 해당 목록에 grep {/particular word/}이 작동합니다. 성능의 관점에서

당신은 당신이 대신 &&and를 사용하거나 때문에 연산자 우선 순위의 괄호에 플립 플롭 표현을 포장해야

for (<>) { 
    $number++ if /START/../END/ and /a/; 
} 

주와 더 나을 것입니다.

모두 결합 :

my $number = grep {/START/../END/ and /particular word/} <>; 
+0

안녕하세요, 즉시 답장을 보내 주셔서 감사합니다. 샘플 로그/코드를 제공하지 않아서 죄송합니다. 나는 데이터에서 '다른'단어의 수를 원한다. 이런 이유 때문에 나는 퍼거슨 (Ferguson)이 배열을 만들고 각 단어에 'grep'을 사용하는 접근 방식을 취할 것입니다. – pkr13

+0

@ pkr13 : 그러면 그의 대답을 받아 들여야합니다. 또한 관련 샘플 로그/코드를 포함하도록 질문을 편집 할 수 있습니다. – flesk

0

처럼 내가 얻을 수 있습니다 'START'와 'END'사이의 모든 텍스트를 배열에 넣고 'grep'합니다. 기타?

(push @ar,$_) if /START/ .. /END/; 
grep {/word/ @ar}; 

또한 그것은 여러 수준의가 '확인'인 뷰 성능 지점에서 플립 플롭 연산자 블록 경우?

NASA에서 근무하지 않는 한.