分页: 1 / 1
从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 10:28
由 pityonline
一个文件里都是一些 IP,如 11.22.11.0,11.22.111.1 这种的有 4 万行左右,想取前三个字段完全匹配的行数,怎么取?
现在有个问题就是 11.22.111 会被纳入 11.22.1 和 11.22.11 重复计算,比如 11.22.1 总行数为 10,但实际是 4 行,11.22.11 和 11.22.111 还占了 6 行,也给算进去了。
我知道通过设置单词边界可以精确匹配 11.111.111 不被纳入 11.111.1 和 11.111.11 重复计算,但这个需要引入变量,一引入变量就不能设置单词边界了。
如
代码: 全选
awk '$1~"11.22.1//>" {print $1}' xxx.txt
可以精确匹配,但
代码: 全选
for ip in `cat ip.txt`; do awk -v ip=$ip '$1~ip {print $0}' xxx.txt; done
就不行。
请感兴趣的同学帮忙看看,感谢!
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 10:38
由 daf3707
前三个字段把后面的.也加上呢,如11.22.1.
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 10:39
由 eexpress
想取前三个字段完全匹配的行数
就是输入xxx.yyy.zzz 然后找出有多少行?
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 10:48
由 eexpress
应该写出你想要的结果。
比如
11.111.111=5
11.111.113=11
11.111.114=100
是要这统计?
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 13:35
由 pityonline
eexpress 写了:应该写出你想要的结果。
比如
11.111.111=5
11.111.113=11
11.111.114=100
是要这统计?
是要按 IP 的前三个字段做下统计,想要的结果类似:
11.111.111 = 5
11.111.112 = 2
11.111.11 = 3
11.111.1 =4
但实际出来的结果却是:
11.111.111 = 5
11.111.112 = 2
11.111.11 = 10
11.111.1 =14
匹配 11.111.1 时把 11.111.11 和 11.111.111/112 都计算进去了,单个 IP 可以用单词边界限制,但要批量匹配 IP,引入变量时单词边界就不生效了。
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 13:36
由 pityonline
daf3707 写了:前三个字段把后面的.也加上呢,如11.22.1.
试过加点,会被正则匹配。
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 14:12
由 eexpress
代码: 全选
● cat t|perl -e 'while(<>){/^(.*?\.){3}/; $h{$&}+=1;}; foreach $i(keys(%h)){print ("$i=> $h{$i}\n")}'
10.0.18.=> 1
10.0.8.=> 2
33.1.1.=> 1
192.168.1.=> 1
10.0.28.=> 1
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 14:15
由 eexpress
代码: 全选
● cat t|perl -e 'while(<STDIN>){/^(.*?\.){3}/; $h{$&}+=1;}; while ( my ($k,$v) = each %h) {print "$k => $v\n";}'
10.0.18. => 1
10.0.8. => 2
33.1.1. => 1
192.168.1. => 1
10.0.28. => 1
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-04 14:19
由 HuntXu
代码: 全选
sed "s/\.[0-9]\+$//" xxx.txt > tmp.txt
cat tmp.txt|sort|uniq -c
這樣不行?
Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数
发表于 : 2013-09-08 14:13
由 needle
楼上的好想法!
代码: 全选
grep -o '.*\.' | sed 's;\.$;;' xxx.txt | sort | uniq -c
或者:
代码: 全选
egrep -o '([0-9]+\.){2}[0-9]+' xxx.txt | sort | uniq -c