仅使用sed / BASH将扩展的IPv6转换为PTR的反向半字节arpa

时间:2018-12-07 17:46:07

标签: bash sed

我有很多使用的IPv6地址,但今天可以说是2001:abc::1

我已经可以使用BASH将其扩展为:2001:0abc:0000:0000:0000:0000:0000:0001

我需要使用扩展了的 IPv6,并将其反转为我的PTR的一个半字节(加上arpa字符串),所以它看起来像这样:

1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.b.a.0.1.0.0.2.ip6.arpa

我将允许awk或其他低级答案使社区受益,BASH和功能还可以,但是单行sed会震撼我的世界。


注意:有人在讨论这是一个“实际问题”。我的脚本仅使用sed,在任何地方都不使用awk,并且比/sh更倾向于/bash。我认为维护脚本实际上是“依赖性”的一部分所需的技能,因此我避免使用awk。但是,为了对社区有用,此处应该欢迎awk的答案。不使用awk的BASH函数也将受到欢迎。

3 个答案:

答案 0 :(得分:3)

GNU sed单一代码,可能主要是为了证明您不应该为此使用sed:

sed 's/://g;s/^.*$/\n&\n/;tx;:x;s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/;tx;s/\n//g;s/\(.\)/\1./g;s/$/ip6.arpa/'

分手并发表评论:

# Remove all the colons
s/://g

# Embed line between two newlines
s/^.*$/\n&\n/

# Reset flag tested by t
tx

# Label to jump to
:x

# Swap two characters
s/\(\n.\)\(.*\)\(.\n\)/\3\2\1/

# Jump to label if substitution did something
tx

# Remove newlines
s/\n//g

# Insert period after each character
s/\(.\)/\1./g

# Append rest of desired string
s/$/ip6.arpa/

行反转技术取自GNU sed manual

唯一需要GNU sed的地方是仅使用\n插入换行符。如果您使用文字换行符代替s/^.*$/\n&\n/,则使用

s/^.*$/\
&\
/

该脚本应与任何sed一起运行。

答案 1 :(得分:2)

names

...作为输出发出:

list

答案 2 :(得分:2)

在任何UNIX系统上的任何shell中使用任何awk:

$ awk '{
    gsub(/:/,"")
    for (i=length($0); i>0; i--) {
        printf "%s.", substr($0,i,1)
    }
    print "ip6.arpa"
}' file
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.c.b.a.0.1.0.0.2.ip6.arpa