我知道这是可能的,可能通过使用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
,您可以将输入字段分隔符设置为.
或-
,将输出字段分隔符设置为.
,然后打印第一个字段到第四个字段,即 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