"10.1.1.1-10.1.1.3" 형식을 "10.1.1.1-3"으로 변환

"10.1.1.1-10.1.1.3" 형식을 "10.1.1.1-3"으로 변환

아마도 를 사용하면 이것이 가능하다는 것을 알고 있지만 awk지금은 해결책이 생각나지 않습니다.

IP 형식을 변환하는 방법

10.1.1.1-10.1.1.3
10.100.100.11-10.100.100.31

도착하다

10.1.1.1-3
10.100.100.11-31

여기에 내 시도가 있지만 cut실제로 예상대로 작동하지 않습니다.

wolf@linux:~$ echo 10.1.1.1-10.1.1.3 | cut -d . -f 1,2,3,4
10.1.1.1-10
wolf@linux:~$ 

wolf@linux:~$ echo 10.100.100.11-10.100.100.31 | cut -d . -f 1,2,3,4
10.100.100.11-10
wolf@linux:~$ 

답변1

다음은 공통 구성 요소 수에 맞게 조정된 AWK를 사용하는 일반적인 솔루션입니다.

BEGIN {
    FS = "-"
}

NF == 2 {
    split($1, start, /\./)
    split($2, end, /\./)
    printf $1
    for (i = 1; i <= length(start); i++) {
        if (start[i] != end[i]) {
            for (j = i; j <= length(end); j++)
                printf "%s%s", (j > i ? "." : "-"), end[j]
            print ""
            next
        }
    }
    print ""
}

이것은 또한 비슷한 상황을 처리하여 1.2.3.4-1.2.5.6올바른 범위를 인쇄합니다.

1.2.3.4-5.6

답변2

여기에 sed방법이 있습니다. -줄에서 마지막 줄까지 모든 항목을 찾아서 로 저장 \1한 다음 마지막으로 나타나는 a .와 하나 이상의 숫자를 로 저장합니다 \2. 그런 다음 전체 줄이 다음으로 대체됩니다 \1\2.

$ sed -E 's/(.*-).*\.([0-9]+)/\1\2/' file 
10.1.1.1-3
10.100.100.11-31

또는 awk입력 필드 구분 기호를 or로 설정하고 .출력 -필드 구분 기호를 로 설정 .한 다음 첫 번째 필드를 네 번째 필드(a -및 마지막 필드)에 인쇄할 수 있습니다.

$ awk -F'[-.]' -vOFS="." '{print $1,$2,$3,$4"-"$NF}' file 
10.1.1.1-3
10.100.100.11-31

답변3

한 가지 옵션 awk:

awk -F'[.-]' '{ print $1"."$2"."$3"."$4"-"$8 }'

산출:

10.1.1.1-3
10.100.100.11-31

답변4

$ sed 's/-.*\./-/' file
10.1.1.1-3
10.100.100.11-31

관련 정보