如何将十六进制IP地址转换为点分十进制表示法

时间:2015-03-13 05:00:28

标签: awk

嗨我有一个IP地址存储为

的文件
ssIpAddress: AC1AF0F1
.
.
.
ssIpAddress: AC1AF011

等等,

我使用awk查找并打印如下,

awk '
/ssIpAddress/ {
str = sprintf("0x%s", $2)
ssIp = strtonum(str)
printf ("%d.%d.%d.%d\t",
rshift(and(ssIp,0xff000000),24),
rshift(and(ssIp,0x00ff0000),16),
rshift(and(ssIp,0x0000ff00),08),
rshift(and(ssIp,0x000000ff),00))
}' <file>

当我尝试这个时,我得到非法的语法错误。任何人都可以用语法识别错误吗?

2 个答案:

答案 0 :(得分:1)

我强烈怀疑,当你说i get illegal syntax error.时,你确实得到了这个:

awk: syntax error near line 6
awk: illegal statement near line 6

这意味着您正在使用旧的,破坏的awk(Solaris上的/ bin / awk)。永远不要使用那个awk。如果你有,请使用gawk,否则如果在Solaris上使用/ usr / xpg4 / bin / awk。 nawk也可以,但不太接近POSIX(例如它不支持像[[:space:]]这样的字符类。)

strtonum()是一种gawk扩展,我相信它是按位运算符函数,因此您需要使用gawk或更改代码。

下次有问题时,请确保完全按原样复制/粘贴任何输出和/或错误消息,以便删除猜测工作,以便我们更方便地为您提供帮助。

答案 1 :(得分:0)

您可以使用 ctf-party(免责声明:我是作者)

require 'ctf_party'

'AC1AF0F1'.from_hexip # => "172.26.240.241"
'AC1AF011'.from_hexip # => "172.26.240.17"
'AC1AF0F1'.from_hexip(nibble: :low) # => "241.240.26.172"
'AC1AF011'.from_hexip(nibble: :low) # => "17.240.26.172"

在 Unix 上,诸如 /proc/net/tcp 之类的某些文件首先使用低位半字节(小端),否则通常先使用高位半字节(默认)。