아마도 를 사용하면 이것이 가능하다는 것을 알고 있지만 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