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