grep 명령을 사용하여 Perl에서 여러 패턴을 검색하는 방법은 무엇입니까?

grep 명령을 사용하여 Perl에서 여러 패턴을 검색하는 방법은 무엇입니까?

Perl에서 grep 명령을 사용하여 여러 필드를 검색하는 방법은 무엇입니까?

다음 파일이 있습니다

파일 1:

access abc permit tcp sourceipaddress sourcesubnet destipaddr destsubnet eq portnumber

여기에서는 필드를 기준으로 분할하고 배열에서 해당 필드를 찾고 있지만 작동하지 않는 것 같습니다. 아래에 설명된 4가지 다른 방법을 시도했지만 아무것도 작동하지 않습니다.

 my @columns = split(' ',$line);
    my $fld0 = $columns[3];
    my $fld3 = $columns[6];
    my $fld5 = $columns[9];

    #my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;

  #my @gitLines = @gitFile =~ /$fld0|$sIP|$dIP|$fld5/;

#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;

#grep {$fld0} && {$sIP} && {$dIP} && {$fld5} @gitFile;

답변1

Perl은 grep코드 블록 (*)$_ 을 허용 하고 블록과 연관된 배열 요소를 제공합니다. /pattern/암시적 일치 $_, &&패턴 일치를 또는 와 결합 할 수 있습니다 ||. 따라서 다음이 작동합니다.

my @foo = qw/abc cde efg ghi/;
printf("%s\n", join(" ",  grep {/c/ || /e/} @foo));
printf("%s\n", join(" ",  grep {/c/ && /e/} @foo));

@foo첫 번째는 또는를 사용하여 c요소를 인쇄하고 e두 번째는 둘 다를 사용하여 요소를 인쇄합니다.

(* 또는 표현식이지만 블록 구문이 더 명확하다고 생각함)


#my @gitLines = grep "$fld0" && $_ =~ "$sIP" && $_ =~ "$dIP" && $_ =~ "$fld5"} @gitFile;

여기에 여는 중괄호가 누락되어 있으며 "$fld0"그 자체로는 $fld0.

#my @gitLines = grep /$fld0/ && /$sIP/ && /$dIP/ && /$fld5/, @gitFile;

나는 이것이 실제로 작동해야 한다고 생각합니다. 블록 대신 표현식을 사용하는 것을 제외하면 두 번째 줄과 동일합니다. 하지만 어쩌면 당신은 그것을 ||대신 원할까요 &&?

관련 정보