从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
联系:

从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#1

帖子 pityonline » 2013-09-04 10:28

一个文件里都是一些 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
就不行。

请感兴趣的同学帮忙看看,感谢!
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
头像
daf3707
论坛版主
帖子: 12739
注册时间: 2007-06-13 15:57
来自: 在他乡

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#2

帖子 daf3707 » 2013-09-04 10:38

前三个字段把后面的.也加上呢,如11.22.1.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#3

帖子 eexpress » 2013-09-04 10:39

想取前三个字段完全匹配的行数
就是输入xxx.yyy.zzz 然后找出有多少行?
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#4

帖子 eexpress » 2013-09-04 10:48

应该写出你想要的结果。
比如
11.111.111=5
11.111.113=11
11.111.114=100

是要这统计?
● 鸣学
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
联系:

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#5

帖子 pityonline » 2013-09-04 13:35

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,引入变量时单词边界就不生效了。
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
头像
pityonline
帖子: 3864
注册时间: 2008-12-09 12:44
来自: 北京
联系:

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#6

帖子 pityonline » 2013-09-04 13:36

daf3707 写了:前三个字段把后面的.也加上呢,如11.22.1.
试过加点,会被正则匹配。
Pity is the bomp!
活着就是折腾!生命不息,折腾不止!
看这帮家伙在干什么?@pityonline/u
Dropbox+Vps+PC 跑起来了!这是邀请链接
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#7

帖子 eexpress » 2013-09-04 14:12

代码: 全选

● 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
● 鸣学
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#8

帖子 eexpress » 2013-09-04 14:15

代码: 全选

● 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
● 鸣学
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#9

帖子 HuntXu » 2013-09-04 14:19

代码: 全选

sed "s/\.[0-9]\+$//" xxx.txt > tmp.txt
cat tmp.txt|sort|uniq -c
這樣不行?
HUNT Unfortunately No Talent...
头像
needle
帖子: 78
注册时间: 2009-12-01 13:34

Re: 从 IP 列表中取出 IP 的前 3 个字段,并统计出现次数

#10

帖子 needle » 2013-09-08 14:13

楼上的好想法! :em05

代码: 全选

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

代码: 全选

egrep -o '([0-9]+\.){2}[0-9]+' xxx.txt | sort | uniq -c
myshell^_^
xfce4.10最好用了……
舒适的滚轮升起焦点设计,大量快捷键,alt移动,糟糕的桌面图标……
珍爱生命,LFS 三思~
回复