![]() | 1 petelin 2016-07-18 21:04:47 +08:00 via Android 就是从空格分开吧,搜一下 awk |
3 billgreen1 2016-07-18 21:10:17 +08:00 2 个 1.0.16.2 是什么鬼? |
4 Bardon 2016-07-18 21:11:14 +08:00 排序? awk 配合 sort |
![]() | 5 changshu 2016-07-18 21:12:46 +08:00 ![]() 两个 IP 之间的区间迭代 shell 下面有 prips 命令, python 下有 netaddr, 处理起来都很方便, 不过都需要装一下 |
![]() | 6 Owenjia 2016-07-18 21:34:25 +08:00 cat <filename> | awk '{print $1"\n"$2}' | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 这样可以不? |
![]() | 7 Owenjia 2016-07-18 21:35:41 +08:00 呃,不对,我好像理解错了…… |
![]() | 8 RIcter 2016-07-18 21:35:44 +08:00 via iPhone shell 可以的( |
![]() | 9 fsckzy OP 楼上的都理解错了。 |
![]() | 12 changshu 2016-07-18 21:50:31 +08:00 parallel --colsep ' ' prips < ip.lst |
13 vimmer 2016-07-18 21:54:02 +08:00 把这个理解为 256 进制的四维数, 就很简单了. |
![]() | 15 lightening 2016-07-18 22:12:30 +08:00 每一行从起始地址到终结地址展开吧?我觉得 Shell 可以,但不知道怎么写。没有特殊需求的话我会用 Python 写省事,但如果你的运行环境只有 shell 的话,肯定也是能用 shell 实现的。 |
![]() | 16 dibage 2016-07-18 22:14:20 +08:00 简单理解就是解析出两个 IP 段之间的 IP 地址列表,是吧? 我推荐用 Python 去实现,思路就是先把 IP 地址转换为整数,然后通过循环两个 IP 段数值计算出这个 IP 段内的 IP 列表。 参考链接: http://stackoverflow.com/questions/5619685/conversion-from-ip-string-to-integer-and-backward-in-python |
![]() | 17 likuku 2016-07-18 22:15:05 +08:00 或者,先转化成 ipv4 的本源: 32 位的 2 进制数字,再进行你的需求运算,结果转成给人类阅读的 点分 4 个 10 进制数 |
![]() | 18 honorking 2016-07-18 22:32:00 +08:00 ![]() 必须是万能的 awk: awk '{split($1,a,".");split($2,b,".");for(i=a[3];i<=b[3];i++){for(j=a[4];j<=b[4];j++){print a[1]"."a[2]"."i"."j}}}' file.txt |
![]() | 19 msg7086 2016-07-18 23:57:05 +08:00 自然是可以用 shell 来写,不过通常用高级语言写起来更舒服些,比较容易维护。 至少不像楼上这么长的 awk 那么难懂…… |
21 smilejustforfan 2016-07-19 01:12:04 +08:00 man ipcalc |
![]() | 22 caola 2016-07-19 01:27:15 +08:00 如果系统自带的东西可以实现,建议尽量不要使用第三方语言或工具, 当然如果效率和占用的资源适合的话,可以考虑自己认为适合的语言来实现 |
![]() | 23 DravenJohnson 2016-07-19 05:20:48 +08:00 |
![]() | 25 4everLoveU 2016-07-19 09:44:49 +08:00 可以实现,思路: 先 sort | uniq 排序去重 然后 awk 用" . "切除前三个字符,后面的补一个 for 循环 0~255 ,最后作拼接即可... |
![]() | 26 araraloren 2016-07-19 10:04:44 +08:00 ~~ 对于脚本能解决的问题不存在实现不能实现的问题,只是方便不方便的问题 ```perl6 #!/usr/bin/env perl6 sub ip2Int(@ip) { my Int $ipint = 0; for ^4 { $ipint +<= 8; $ipint +|= @ip[$_]; } $ipint; } sub int2Ip($ipint) { my @ip; @ip.push: ($ipint +> (8 * .Int)) +& 0xff for ^4; @ip.reverse; } say int2Ip($_) for ip2Int([1, 0, 16, 0]) ... ip2Int([1, 0, 31, 255]); ``` 下面是测试 测试,如果你是想要的这种效果的话。。 [TEST LINK]( https://ideone.com/KOG2Gp) |
27 sualwu 2016-07-19 10:52:13 +08:00 debian8:~$ cat iplists 1.1.1.250 1.1.2.10 1.1.2.252 1.1.3.2 debian8:~$ for iplist in `cat iplists | sed -r 's/\s+/##/g'`; do intip1=`echo $iplist | awk -F'##' '{print $1}' | awk -F. '{print($1*2^24+$2*2^16+$3*2^8+$4)}'`; intip2=`echo $iplist | awk -F'##' '{print $2}' | awk -F. '{print($1*2^24+$2*2^16+$3*2^8+$4)}'`; for ((ip=$intip1;ip<=$intip2;ip++)); do ((i1=$ip>>24,i2=$ip>>16&0x00ff,i3=$ip>>8&0x0000ff,i4=$ip&0x000000ff)); echo $i1.$i2.$i3.$i4; done; done 1.1.1.250 1.1.1.251 1.1.1.252 1.1.1.253 1.1.1.254 1.1.1.255 1.1.2.0 1.1.2.1 1.1.2.2 1.1.2.3 1.1.2.4 1.1.2.5 1.1.2.6 1.1.2.7 1.1.2.8 1.1.2.9 1.1.2.10 1.1.2.252 1.1.2.253 1.1.2.254 1.1.2.255 1.1.3.0 1.1.3.1 1.1.3.2 |
![]() | 28 wizardoz 2016-07-19 11:25:29 +08:00 你是在问 bash 有没有循环功能?我告诉你,有! |
29 sunmsn 2016-07-19 16:20:48 +08:00 import netaddr def ip2int(addr): return int(netaddr.IPAddress(addr)) def int2ip(addr): return str(netaddr.IPAddress(addr)) with open('data.txt','r') as f: for line in f: ip_1,ip_2 = line.strip().split() for i in range(ip2int(ip_1),ip2int(ip_2)+1): print int2ip(i) print '-'*80 |
30 Azus 2016-07-19 18:30:50 +08:00 shell scripts 不就是用来利用和关联各种程序的么, 避免造轮子才是应该的 如果是在 debian 系, 12 楼 @changshu 的答案最好 redhat 系有些不幸,没有 prips, 这个轮子似乎还是可以造一下 @DravenJohnson 23 楼的实现不对, 1.0.16.10 到 1.0.17.0 之间的 ip 缺失 纯 Bash, 没觉得比其它的复杂, 还不依赖其它软件 usage: ./prips.sh iplists_file ---- #!/usr/bin/env bash ip2int() { local i local int for i in {0..3}; do ((int <<= 8)) ((int += $1[i])) done echo $int } int2ip() { local i int=$1 for i in {0..3}; do ((ip[i] = int & 255)) ((int >>= 8)) done echo ${ip[3]}.${ip[2]}.${ip[1]}.${ip[0]} } while read -ra ipl; do s=(${ipl[0]//./ }) e=(${ipl[1]//./ }) for ((i = $(ip2int s); i <= $(ip2int e); i++)) { int2ip $i } done < $1 ---- |
![]() | 31 itisthecon 2016-07-19 18:39:38 +08:00 用 perl , 应该是最简洁了吧: #!/usr/bin/perl use 5.10.1; use Socket; open ( FH,'iplist' ); while ( <FH> ){ my @a = split; $s = unpack("N", inet_aton ( "$a[0]" )); $e = unpack("N", inet_aton ( "$a[1]" )); for ( $i=$s;$i<=$e;$i++ ){ say inet_ntoa(pack("N", $i)); } } |
32 Balthild 2016-07-20 01:21:13 +08:00 跑个题, php $arr = explode(" ", $input); $long1 = ip2long($arr[0]); $long2 = ip2long($arr[1]); for ($i = $long1; $i <= $long2; $i++) { $ips[] = long2ip($i); } print_r($ips); |
33 Balthild 2016-07-20 01:27:53 +08:00 |