다음 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
-l
print 문에 자동 chomp
ing 및 자동 줄 바꿈 기능을 제공합니다.
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의 솔루션을 좋아합니다. 훌륭하고 읽기 쉽습니다.