2016-11-25 7 views
-1

"netstat -rn"의 실제 라우팅 테이블을 보안 공급 업체의 구성에 구성된 라우팅 테이블과 비교할 스크립트가 있습니다. 문제는 netstat -rn이 "255.255.255.0"형식의 넷 마스크를 제공하는 반면 공급 업체 내 라우팅 테이블을 표시하는 명령은/24 형태로 나타납니다.awk : 접두어로 서브넷 마스크 변환

생성 방법을 찾아야합니다. 서브넷 마스크, 예를 들어 255.255.255.0에서 변환 만 AWK 사용하는 기능은, 예를 들어, 접두사 :/24

function subnetmaskToPrefix(subnetmask) { 
doing magic 
} 

subnetmask="255.255.255.0" 
prefix=subnetmaskToPrefix(subnetmask) 
+0

간결하고 테스트 가능한 샘플 입력과 예상 출력을 포함하고 필요한 변환 알고리즘에 대해 알고있는 내용을 설명하십시오. –

+0

이 링크는 유용 할 수 있습니다 : http://stackoverflow.com/questions/10278513/bash-shell-decimal-to-binary-conversion –

답변

1

바이너리로 변환 할 때 접두사 번호가 서브넷 마스크 1의 수에서 오는 경우 . 예 :

마스크 255.255.255.0은 이진수로 11111111.11111111.11111111.00000000입니다. 24 1이야.

echo "255.255.255.0" | awk ' 
function count1s(N){ 
    c = 0 
    for(i=0; i<8; ++i) if(and(2**i, N)) ++c 
    return c 
} 
function subnetmaskToPrefix(subnetmask) { 
    split(subnetmask, v, ".") 
    return count1s(v[1]) + count1s(v[2]) + count1s(v[3]) + count1s(v[4]) 
} 
{ 
    print("/" subnetmaskToPrefix($1)) 
}' 

당신이 얻을,

/24 
+0

의미가 있습니다. 그리고 나는 당신이 작성한 두 가지 기능 중 대부분을 이해하고 있다고 생각합니다. 이 부분은 if (및 (2 ** i, N)) 및 (2 ** i, N)은 무엇을합니까? – Johnathan

+0

나는 내가 사용하는 awk 풍미가 gawk가 아니다라고 언급 할 수 있었다, 나는 그 awk 또는 매가 생각한다. – Johnathan

1

아래의 솔루션은 둔한 위대한 작품. 하지만 gawk를 사용하지 않으면이 함수를 사용하여 계산할 수 있습니다.

function count1s(N) { 
    r=""     # initialize result to empty (not 0) 
    while(N!=0){   # as long as number still has a value 
     r=((N%2)?"1":"0") r # prepend the modulos2 to the result 
     N=int(N/2)   # shift right (integer division by 2) 
    } 

    # count number of 1s 
    r=gsub(/1/,"",r) 
    # Return result 
    return r 

}