分页: 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
楼上的好想法! :em05

代码: 全选

grep -o '.*\.' | sed 's;\.$;;' xxx.txt | sort | uniq -c
或者:

代码: 全选

egrep -o '([0-9]+\.){2}[0-9]+' xxx.txt | sort | uniq -c