grep 파일의 IP 번호 일부

grep 파일의 IP 번호 일부

방화벽에서 학급 전체를 차단할 수 있도록 IP 주소를 분류해야 합니다. /24 클래스에서 작동하려고 하면 제대로 작동하지만 /16 클래스에서 작동하면 제대로 작동하지 않습니다. 정렬하려는 IP 목록이 txt 파일에 있습니다.

for IPBL in `cat /tmp/IPs`; do 
  CT=`grep -c ${IPBL%.[0-9]*} /tmp/IPs`
    if [ "$CT" -gt "10" ]; then 
      echo "$IPBL  ${IPBL%.[0-9]*}.0/24  $CT" >>/tmp/spam.lst
    fi
done
cat /tmp/spam.lst |sort -n

따라서 이것은 잘 작동하고 10보다 일치하는 모든 IP가 클래스 C라는 것을 인쇄합니다.

for IPBL in `cat /tmp/IPs`; do 
  CT=`grep -c ${IPBL%.[0-9]*.[0-9]*} /tmp/IPs`
    if [ "$CT" -gt "10" ]; then 
      echo "$IPBL  ${IPBL%.[0-9]*.[0-9]*}.0.0/16  $CT" >>/tmp/spam.lst
    fi
done
cat /tmp/spam.lst |sort -n

따라서 이 예에서는 대부분의 일치 항목이 괜찮지만 일부 일치 항목은 grep그 이상일 것입니다.

  • IP 등이 8.6.X.X일치합니다 18.6.X.X.168.6.X.X

^${IPBL%.[0-9]*.[0-9]*}일치하는 줄의 시작 부분 에 배치하려고 시도했지만 grep도움이 되지도 않았고 그렇지도 않았습니다.

grep -E -c "${IPBL%.[0-9]{1,3}.[0-9]{1,3}}" /tmp/IPs

IP 번호의 특정 자릿수를 일치시키고 ^문자열 앞에 넣지 마십시오.

정확한 일치 항목을 추출하는 가장 효율적인 방법은 무엇입니까?
/tmp/IPs 파일은 크지만 B 마스크 grep을 실행하면 다음 IP 번호가 모두 일치합니다. 정확하게는 일치하는 항목이 1개뿐입니다(라인 2).

#IPBL=8.6.144.6
#grep ${IPBL%.[0-9]*.[0-9]*} /tmp/IPs
5.188.62.76
8.6.144.6
39.48.63.128
49.178.61.44
68.61.98.98
73.121.228.65
78.128.60.44
81.68.68.194
86.185.248.61
103.129.178.69
108.61.115.213
108.61.199.100
138.68.224.206
138.68.235.36
142.4.218.69
148.63.196.97
148.64.121.254
148.66.129.250
148.66.130.114
149.202.8.66
173.228.198.65
174.251.128.60
176.78.65.246
176.9.208.67
178.128.68.121
178.62.67.41
178.63.146.46
212.48.66.224

답변1

내가 올바르게 이해했다면 IP 목록을 구문 분석하여 해당 IP가 속한 클래스 B 또는 클래스 C 네트워크를 확인하고 싶을 것입니다. 해당 네트워크가 10번 이상 나타나는 경우 댓글에 IP와 해당 네트워크가 속한 네트워크를 인쇄해야 합니다.

A.B.C.D   A.B.0.0/16  n

또는

A.B.C.D   A.B.C.0/24  n

각 출력 파일을 작성합니다 spam.lst. 여기서 는 n해당 서브넷의 실제 발생 횟수입니다.

awk나는 작업에 대해 다음 절차를 제안합니다 (라고 부르겠습니다 sort.awk).

#!/bin/awk -f

BEGIN{
    FS=OFS="."
}

NF==4{
    if (FNR==NR) {
        NF=cl
        count[$0]++
        next
    }
    for (n in count) {
        if (index($0,n)==1) {
            if (count[n]<=th) next
            printf "%s %s",$0,n
            for (i=cl;i<4;i++) printf ".0"
            printf "/%d %d\n",8*cl,count[n]
        }
    }
}

다음과 같이 호출할 수 있습니다.

awk -v cl=2 -v th=1 -f sort.awk ips.txt ips.txt> spam.lst

입력 파일은 두 번 처리되므로 awk!에 대한 인수로 두 번 나타납니다.

프로그램 작동 방식은 다음과 같습니다.

  • CIDR 네트워크 범주를 awk클래스 B 네트워크 또는 클래스 C 네트워크에 대한 변수로 지정할 수 있습니다.cl23
  • 전체 서브넷을 차단하는 최소 발생 횟수를 awk변수 로 지정할 수 있습니다 th.
  • 프로그램은 .입력 행을 필드로 분할하기 위해 입력 및 출력 구분 기호를 설정합니다 ..
  • 스크립트는 4개의 필드가 있는 행만 고려합니다(IP에 대한 최소한의 온전성 검사).
  • 첫 번째 단계( FNR파일별 줄 카운터가 NR전역 줄 카운터와 동일함)에서는 발견된 서브넷을 등록합니다. 각 행에 대해 필드 번호는 cl클래스 B 또는 클래스 C 네트워크 "기본 주소"로 자르기 위해 값으로 잘립니다 . 그런 다음 배열에서 이(새로 생성된) 기본 주소의 카운터가 count증가하고 처리가 다음 줄로 점프합니다.
  • 두 번째 패스에서는 모든 항목을 반복합니다.색인( 즉, count첫 번째 패스에 등록된 모든 서브넷) 현재 줄의 IP가 해당 서브넷 주소로 시작하는지 확인합니다. 연결 수가 임계값보다 크면 현재 IP 주소를 출력한 다음 기본 주소를 출력하고 .0오른쪽에 CIDR 표기법으로 넷마스크를 추가하고 마지막으로 발생 횟수를 출력합니다.

의 출력은 표시된 샘플 IP 목록 cl=2과 함께 다음과 같습니다 .th=1

108.61.115.213 108.61.0.0/16 2
108.61.199.100 108.61.0.0/16 2
138.68.224.206 138.68.0.0/16 2
138.68.235.36 138.68.0.0/16 2
148.66.129.250 148.66.0.0/16 2
148.66.130.114 148.66.0.0/16 2

초기 제안은 다음과 같이 기존 스크립트에 통합하는 것이었습니다.

awk -v cl=2 -v nw="8.6.0.0" -F'.' 'BEGIN{split(nw,ref,/\./)} NF==4{for (i=1;i<=cl;i++) {if ($i!=ref[i]) next} printf "%s %s/%d\n",$0,nw,8*cl}' ips.txt

여기서는 IP 목록을 분석하여 awk해당 IP가 변수를 통해 지정된 네트워크 기본 주소와 동일한 네트워크에 속하는지 확인합니다 nw.

  • 처음에는 참조 네트워크 기본 IP가 필드별로 배열로 분할됩니다 ref.
  • 발견된 각 줄에 대해 프로그램은 먼저 해당 줄에 4개의 필드가 포함되어 있는지 확인합니다(IP에 대한 최소한의 온전성 검사). 그렇다면 cl현재 행을 참조 IP의 첫 번째 필드와 비교합니다. 일치하지 않는 항목이 있으면 해당 줄을 건너뛰고 다음 줄을 계속 처리하세요. 모든 관련 필드가 일치하면 IP가 인쇄된 다음 CIDR 표기법으로 네트워크가 인쇄됩니다.

답변2

원래 질문을 기반으로 grep 문을 업데이트하여 원하는 결과를 얻었습니다. bash 전용 솔루션에 관심이 있는 사람을 위해 업데이트된 코드 섹션은 다음과 같습니다.

for IPBL in `cat /tmp/IPs`; do 
  CT=`grep -c "^${IPBL%.[0-9]*.[0-9]*}\." /tmp/IPs`
    if [ "$CT" -gt "10" ]; then 
      echo "$IPBL  ${IPBL%.[0-9]*.[0-9]*}.0.0/16  $CT" >>/tmp/spam.lst
    fi
done
cat /tmp/spam.lst |sort -n

grep의 매개변수가 변경되었습니다
^. 줄의 시작 부분에서 시작하여
\.IP 주소의 두 번째 숫자 뒤에 점을 추가하면 특정 클래스 B IP 범위와 정확하게 일치합니다.

"^${IPBL%.[0-9]*.[0-9]*}\."

이제 ip 8.6.144.6에는 IPs 파일에 일치 항목이 하나만 있으므로 출력에는 표시되지 않지만 클래스 B 일치 항목은 다음과 같습니다.
3.8.35.118  3.8.0.0/16  12
3.8.36.119  3.8.0.0/16  12
3.8.36.121  3.8.0.0/16  12
3.8.37.124  3.8.0.0/16  12
3.8.37.125  3.8.0.0/16  12
3.8.37.126  3.8.0.0/16  12
3.8.37.94  3.8.0.0/16  12
3.8.37.96  3.8.0.0/16  12
3.8.37.97  3.8.0.0/16  12
3.8.37.97  3.8.0.0/16  12
3.8.37.98  3.8.0.0/16  12
3.8.37.98  3.8.0.0/16  12

관련 정보