Perl oneliner + 파일의 첫 번째 /sec 필드에 있는 IP 주소를 일치시키는 방법

Perl oneliner + 파일의 첫 번째 /sec 필드에 있는 IP 주소를 일치시키는 방법

다음 Perl oneliner 구문은 "$IP"의 IP 주소가 파일의 IP 주소와 일치하는지 확인합니다.

     perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' $IP file

파일에는 두 개의 필드가 있습니다.

다음 예와 같이

more file


192.9.200.1  172.19.2.100
10.23.1.10   34.12.0.1
45.2.11.1    192.9.200.1
.
.
.

첫 번째 필드나 두 번째 필드에 있는 IP와 일치하도록 Perl 구문을 정의하는 것이 가능합니까? - 그렇다면 구문을 변경해야 합니까?

예를 들어 (첫 번째 필드만 일치시키려는 경우)

     perl -ne 'BEGIN{$IP=shift} print if /(^|\s)\Q$IP\E(\s|$)/;' 192.9.200.1 file

그런 다음 줄의 첫 번째 필드인 192.9.200.1에 있는 IP와 일치해야 합니다.

   "192.9.200.1  172.19.2.100"

답변1

저는 Perl의 "자동 분할" 옵션을 사용하겠습니다.-a정규 표현식을 멀리하세요

perl -lane 'BEGIN{$IP=shift} print if $F[0] eq $IP or $F[1] eq $IP' $IP file
perl -lane 'BEGIN{$IP=shift} print if grep {$_ eq $IP} @F[0,1]' $IP file

-lprint 문에 자동 chomping 및 자동 줄 바꿈 기능을 제공합니다.

awk가 더 간단합니다.

awk -v ip=$IP '$1==ip || $2==ip' file

질문을 두 번째로 읽으면 첫 번째 열만 일치시키거나 두 번째 열만 일치시키기를 원할 수도 있음을 알 수 있습니다. 열 번호를 매개변수로 전달하려면:

perl -lane '
    BEGIN {($IP,$col) = splice @ARGV,0,2}
    print if $F[$col-1] eq $IP
' $IP 2 file
awk -v ip=$IP -v col=2 '$col == ip' file

샘플 데이터가 주어지면 다음이 반환됩니다.

45.2.11.1    192.9.200.1

답변2

"이 작업을 수행하는 방법은 여러 가지가 있습니다." :-)

첫 번째 또는 두 번째 열에서 IP 주소를 찾는 또 다른 방법은 grep을 사용하는 것입니다.

열 1의 경우:

grep ^192.9.200.1 file

그러면 첫 번째 열에 IP가 포함된 모든 행이 출력됩니다.

열 2의 경우:

grep 192.9.200.1$ file

그러면 마지막 열에 IP가 포함된 모든 행이 출력됩니다.

나는 IP가 열 1과 2에 있는지 확인하기 위해 awk를 사용하는 Glenn의 솔루션을 좋아합니다. 훌륭하고 읽기 쉽습니다.

관련 정보