Bash 批量将IP地址转换为小数?

Bash 批量将IP地址转换为小数?,bash,shell,sed,command-line,ip-address,Bash,Shell,Sed,Command Line,Ip Address,我有一个大文件,每行包含2个IPs,总共大约有300万行 以下是该文件的一个示例: 1.32.0.0,1.32.255.255 5.72.0.0,5.75.255.255 5.180.0.0,5.183.255.255 222.127.228.22,222.127.228.23 222.127.228.24,222.127.228.24 我需要将每个IP转换为IP十进制数,如下所示: 18874368,18939903 88604672,88866815 95682560,95944703 3

我有一个大文件,每行包含2个
IPs
,总共大约有300万行

以下是该文件的一个示例:

1.32.0.0,1.32.255.255
5.72.0.0,5.75.255.255
5.180.0.0,5.183.255.255
222.127.228.22,222.127.228.23
222.127.228.24,222.127.228.24
我需要将每个
IP
转换为
IP十进制数,如下所示:

18874368,18939903
88604672,88866815
95682560,95944703
3732923414,3732923415
3732923416,3732923416
我更喜欢通过命令行严格执行此操作。我同意使用
perl
python
,只要它不需要安装额外的模块


我以为我遇到了一种方法,有人使用
sed
像这样转换了
IPs
,但似乎再也找不到该教程了。任何帮助都将不胜感激。

这里是
python
解决方案,它只使用标准模块(re,sys):

此解决方案替换标准输入或作为第一个参数传递的文件文本中的每个ip地址,即:

  • python convert.py
  • python convert.py file.txt,或
  • echo“1.2.3.4,5.6.7.8”| python convert.py

这里是
python
解决方案,它只使用标准模块(re,sys):

此解决方案替换标准输入或作为第一个参数传递的文件文本中的每个ip地址,即:

  • python convert.py
  • python convert.py file.txt,或
  • echo“1.2.3.4,5.6.7.8”| python convert.py

如果安装了gnu awk(对于
RT
变量),则可以使用以下一个线性程序:

awk -F. -v RS='[\n,]' '{printf "%d%s", (($1*256+$2)*256+$3)*256+$4, RT}' file
18874368,18939903
88604672,88866815
95682560,95944703
3732923414,3732923415
3732923416,3732923416

如果安装了gnu awk(对于
RT
变量),则可以使用以下一个线性程序:

awk -F. -v RS='[\n,]' '{printf "%d%s", (($1*256+$2)*256+$3)*256+$4, RT}' file
18874368,18939903
88604672,88866815
95682560,95944703
3732923414,3732923415
3732923416,3732923416
对于bash:

ip2dec() {
  set -- ${1//./ }     # split $1 with "." to $1 $2 $3 $4
  declare -i dec       # set integer attribute
  dec=$1*256*256*256+$2*256*256+$3*256+$4
  echo -n $dec
}

while IFS=, read -r a b; do ip2dec $a; echo -n ,; ip2dec $b; echo; done < file
ip2dec(){
将--${1/./}#用“.”拆分$1到$1$2$3$4
declare-i dec#set integer属性
十二月=$1*256*256*256+$2*256*256+$3*256+$4
echo-n$dec
}
当IFS=,read-rab;做ip2dec$a;echo-n,;ip2dec$b;回声;完成<文件
输出:

18874368,18939903 88604672,88866815 95682560,95944703 3732923414,3732923415 3732923416,3732923416 18874368,18939903 88604672,88866815 95682560,95944703 3732923414,3732923415 3732923416,3732923416 对于bash:

ip2dec() {
  set -- ${1//./ }     # split $1 with "." to $1 $2 $3 $4
  declare -i dec       # set integer attribute
  dec=$1*256*256*256+$2*256*256+$3*256+$4
  echo -n $dec
}

while IFS=, read -r a b; do ip2dec $a; echo -n ,; ip2dec $b; echo; done < file
ip2dec(){
将--${1/./}#用“.”拆分$1到$1$2$3$4
declare-i dec#set integer属性
十二月=$1*256*256*256+$2*256*256+$3*256+$4
echo-n$dec
}
当IFS=,read-rab;做ip2dec$a;echo-n,;ip2dec$b;回声;完成<文件
输出:

18874368,18939903 88604672,88866815 95682560,95944703 3732923414,3732923415 3732923416,3732923416 18874368,18939903 88604672,88866815 95682560,95944703 3732923414,3732923415 3732923416,3732923416 使用bash并使用shift(一条CPU指令)代替乘法(许多指令):

ip2dec(){local IFS=。
设置--$1#将$1与“.”拆分为$1$2$3$4
printf“%s'”$($1带bash并使用shift(一条CPU指令)而不是乘法(许多指令):

ip2dec(){local IFS=。
设置--$1#将$1与“.”拆分为$1$2$3$4

printf“%s”$(($1See.See.See.谢谢你的回答!在你的脚本中,我应该在哪里指定我需要在
test.txt
上运行它?它完全符合我的要求,但数学上似乎有问题。如果你尝试通过你的脚本运行我上面的示例IP,它会给出不同的IP小数:/谢谢你的回答!在你的脚本中,应该在哪里我指定我需要在
test.txt
上运行它?它完全符合我的要求,但数学上似乎有问题。如果你尝试通过脚本运行我上面的示例IP,它会给出不同的IP小数:/它可以,性能更好,但它以科学的格式显示IP。@MarekNowaczyk:在我的系统上,这很奇怪stem输出如上图所示(我从终端复制粘贴)。我的awk是GNU awk 4.1.3。您使用的是什么版本?尝试使用
%d%s”
作为格式字符串……这没问题,性能更好,但它以科学格式显示IP。@MarekNowaczyk:这很奇怪,在我的系统上,输出如上图所示(我从终端复制粘贴).My awk是GNU awk 4.1.3。您使用的是什么版本?请尝试使用
“%d%s”
作为格式字符串。。。