おそらく、私はこれが可能であることを知っていますが、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.
と1つ以上の数字をとして保存します\2
。その後、行全体が次に置き換えられます\1\2
。
$ sed -E 's/(.*-).*\.([0-9]+)/\1\2/' file
10.1.1.1-3
10.100.100.11-31
またはawk
、入力フィールド区切り記号を or に設定し、.
出力-
フィールド区切り記号を に設定し、最初のフィールド.
を 4 番目のフィールド (a-
と最後のフィールド) に印刷することもできます。
$ awk -F'[-.]' -vOFS="." '{print $1,$2,$3,$4"-"$NF}' file
10.1.1.1-3
10.100.100.11-31
答え3
1つのオプション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