Linux 및 Solaris - 넷마스크 IP를 일반 IP와 분리

Linux 및 Solaris - 넷마스크 IP를 일반 IP와 분리

IP 주소와 넷마스크 IP가 포함된 파일이 있습니다.

내 목표는 다음과 같이 시작하는 것입니다.file_with_IPs.txt그리고 다른 파일에 붙여넣으세요file_with_only_netmask_ips.txt

주 - 넷마스크 IP는 넷마스크 IP의 조합일 수 있으며 xxx.xxx.xxx.xxx/1에서 최대 xxx.xxx.xxx.xxx/32까지 시작할 수 있습니다.

예를 들어

  10.140.4.11    10.140.4.110    
  255.255.0.0    255.255.255.0    
  10.219.39.188  10.219.39.200
  10.219.39.189  10.219.39.145
  10.140.4.12    10.140.4.120
  10.219.39.138   10.219.39.140
  10.219.39.139   10.219.39.239
  255.0.0.0        255.255.0.0
  255.255.255.128    255.255.255.192

그래서 결국 나는 들어갈 것이다file_with_IPs.txt문서

  10.140.4.11    10.140.4.110    
  10.219.39.188  10.219.39.200
  10.219.39.189  10.219.39.145
  10.140.4.12    10.140.4.120
  10.219.39.138   10.219.39.140
  10.219.39.139   10.219.39.239

그리고file_with_only_netmask_ips.txt다음과 같은 넷마스크 IP만 갖게 됩니다.

  255.255.0.0    255.255.255.0
  255.0.0.0        255.255.0.0
  255.255.255.128    255.255.255.192

넷마스크 IP와 일반 IP를 분리하는 가장 좋은 방법은 무엇인지 제안해주세요.

ksh 쉘을 사용하여 프로세스를 작성해야 하고 Linux 및 Solaris 시스템에서 프로세스를 실행해야 합니다.

참고: perl one Linear, sed 및 awk는 ksh 스크립트에서 사용할 수 있습니다.

답변1

"넷마스크 IP"는 모든 설정 비트가 왼쪽에 함께 그룹화되어 있음을 의미하는 것 같습니다. /0부터 /32까지 32개만 있습니다. grep 문에 이를 나열할 수 있습니다(또는 에 전달하는 파일에 있는 것이 더 좋습니다 grep -f).

이 방법은 지루하지만 간단합니다.

^0\.0\.0\.0$
^128\.0\.0\.0$
^192\.0\.0\.0$
^224\.0\.0\.0$

실제로는 우리가 찾고 있는 이진 패턴이므로 다시 숫자로 변환한 다음 약간 수정하여 패턴과 일치하는지 확인할 수 있습니다. 하지만 이는 grep으로 완료하는 작업이 아니라 실제 프로그래밍 작업이 됩니다.

기원전에 가까운 일을 할 수 있지만. 테스트 방법은 다음과 같습니다 $ip.

(
    echo 'obase=2';
    echo "$ip" | sed -e 's/\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)\.\([0-9]\+\)/\1*(256^3)+\2*(256^2)+\3*256+\4/'
) bc | grep -q '^1*0*$' && echo yes || echo no

분해하면 echo는 bc에게 바이너리로 출력하라고 지시합니다. 그런 다음 이 sed줄은 IP 주소를 표현식으로 변환하여 숫자 값을 계산합니다. 255.255.255.0됩니다 . 255*(256^3)+255*(256^2)+255*256+0보시 bc다시피:

obase=2
255*(256^3)+255*(256^2)+255*256+0

인쇄한 다음 11111111111111111111111100000000패턴과 일치하는지 확인합니다.^1*0*$grep

IP를 숫자로 변환하는 유틸리티가 있으면 위의 복잡성을 상당 부분 제거할 수 있습니다. 그래도 grep패턴 목록을 사용하는 것보다는 느릴 수 있습니다.

답변2

한 가지 방법은 다음과 같습니다 awk.

awk '{
    for(i=1;i<=NF;i++) {
        if($i~/^255/) {
            netmask[NR]=i>1?netmask[NR]"\t"$i:$i
        }
        else { 
            regular[NR]=i>1?regular[NR]"\t"$i:$i
        }
    }
}
END {
    for(i=1;i<=NR;i++) {
        if (regular[i]) {
            print regular[i] > "file_with_IPs.txt"
        }
        if (netmask[i]) {
            print netmask[i] > "file_with_only_netmask_ips.txt"
        }
    }
}' file

시험:

$ ls
file

$ cat file
10.140.4.11    10.140.4.110    
255.255.0.0    255.255.255.0    
10.219.39.188  10.219.39.200
10.219.39.189  10.219.39.145
10.140.4.12    10.140.4.120
10.219.39.138   10.219.39.140
10.219.39.139   10.219.39.239
255.0.0.0        255.255.0.0
255.255.255.128    255.255.255.192

$ awk '{
>     for(i=1;i<=NF;i++) {
>         if($i~/^255/) {
>             netmask[NR]=i>1?netmask[NR]"\t"$i:$i
>         }
>         else { 
>             regular[NR]=i>1?regular[NR]"\t"$i:$i
>         }
>     }
> }
> END {
>     for(i=1;i<=NR;i++) {
>         if (regular[i]) {
>             print regular[i] > "file_with_IPs.txt"
>         }
>         if (netmask[i]) {
>             print netmask[i] > "file_with_only_netmask_ips.txt"
>         }
>     }
> }' file

$ ls
file  file_with_IPs.txt  file_with_only_netmask_ips.txt

$ cat file_with_IPs.txt 
10.140.4.11     10.140.4.110
10.219.39.188   10.219.39.200
10.219.39.189   10.219.39.145
10.140.4.12     10.140.4.120
10.219.39.138   10.219.39.140
10.219.39.139   10.219.39.239

$ cat file_with_only_netmask_ips.txt 
255.255.0.0     255.255.255.0
255.0.0.0       255.255.0.0
255.255.255.128 255.255.255.192

관련 정보