如何使用awk将mac-addr转换为int



输入:

192.168.0.1 aa:bb:cc:00:11:22 192.168.0.1 aa:00:bb:11:cc:22
192.168.10.11 2a:bb:cc:20:11:22 192.168.10.11 aa:02:bb:21:cc:22

输出:

3232235521 187723558162722 3232235521 186920115227682
3232238091 46986071904546 3232238091 186928706210850

我知道如何在python3中将mac转换为int(hex->int):mac = int(mac.replace(':', ''), 16)但是我不能在shell中应用这个方法。也不知道IP到国际

我想使用awk,像这样:

awk '{$1,$3=??, $2,$4=???}' tmpfile > newfile

使用GNU awk for strtonum():

$ echo 'aa:bb:cc:00:11:22' | awk '{gsub(/:/,""); print strtonum("0x"$0)}'
187723558162722
$ echo '192.168.0.1' | awk '{split($0,o,/[.]/); print o[1]*256^3 + o[2]*256^2 + o[3]*256 + o[4]}'
3232235521

$ cat tst.awk
function ip2int(ip,  o) { split(ip,o,/[.]/); return o[1]*256^3 + o[2]*256^2 + o[3]*256 + o[4] }
function mac2int(mac)   { gsub(/:/,"",mac); return strtonum("0x"mac) }
{ print ip2int($1), mac2int($2), ip2int($3), mac2int($4) }

$ awk -f tst.awk file
3232235521 187723558162722 3232235521 186920115227682
3232238091 46986071904546 3232238091 186928706210850

试试这个Perl单行

$ cat matii.txt
192.168.0.1 aa:bb:cc:00:11:22 192.168.0.1 aa:00:bb:11:cc:22
192.168.10.11 2a:bb:cc:20:11:22 192.168.10.11 aa:02:bb:21:cc:22
perl -pe ' s/(d+).(d+).(d+).(d+)/$1*256**3+$2*256**2+$3*256+$4/ge; s/://g ; s/S+s+K(S+)/hex($1)/ge;' matii.txt
3232235521 187723558162722 3232235521 186920115227682
3232238091 46986071904546 3232238091 186928706210850

的Perl等价物

mac = int(mac.replace(':', ''), 16)

$mac = hex( $max =~ s/://rg )

解决方案:

perl -nle'print join " ", unpack "N Q> N Q>", pack "( C4 xx(H2)6 )2", /[0-9a-fA-F]+/g'

指定要处理的文件到Perl一行


更清晰的解决方案:

perl -lane'
sub ipv4_to_dec { unpack "N", pack "C4", split /./, $_[0] }
sub mac_to_dec { hex( $_[0] =~ s/://rg ) }
print join " ",
ipv4_to_dec($F[0]), mac_to_dec($F[1]),
ipv4_to_dec($F[2]), mac_to_dec($F[3]);
'

perl -ple'
sub ipv4_to_dec { unpack "N", pack "C4", split /./, $_[0] }
sub mac_to_dec { hex( $_[0] =~ s/://rg ) }
s{G(s*)(S+)(s+)(S+)}{ $1 . ipv4_to_dec($2) . $3 . mac_to_dec($4) }eg;
'

最新更新