LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3698|回复: 19

shell求救急!

[复制链接]
发表于 2007-8-30 10:51:27 | 显示全部楼层 |阅读模式
我有一个文件  
   内容为:192.168.1.235---[14/Aug/2007:09:34
192.168.1.235---[14/Aug/2007:09:34
236.82.28.12---[14/Aug/2007:09:34
192.168.1.235---[14/Aug/2007:09:34
236.82.28.12---[14/Aug/2007:09:34
192.168.1.235---[14/Aug/2007:09:34
192.168.1.235---[14/Aug/2007:09:34
236.82.28.12---[14/Aug/2007:09:34
192.168.1.235---[14/Aug/2007:09:34
236.82.28.12---[14/Aug/2007:09:34
实现我不知道 这个文件中有什么IP地址,我想写一个脚本抓出该文件中 相同的IP地址,显示IP地址和相同IP个数!
发表于 2007-8-30 15:19:04 | 显示全部楼层
这么简单的任务,自己都不独立 去完成阿 ?大家也没时间给你写啊
我告诉你个方法,自己去 动手

用AWK 吧, 读前面一部分,存成变量,然后用grep ,wc等
回复 支持 反对

使用道具 举报

发表于 2007-8-30 15:39:30 | 显示全部楼层
Post by forlorngenius
用AWK 吧, 读前面一部分,存成变量,然后用grep ,wc等

不用grep和wc啦。
存成关联数组,键是IP,值是出现的次数...
回复 支持 反对

使用道具 举报

发表于 2007-8-31 07:35:44 | 显示全部楼层
假设上面的信息存成文件了(ips)

[color="Magenta"]ips.sh
  1. #!/bin/bash
  2. OIP=
  3. N=0
  4. while read IP
  5. do
  6.   IP=${IP%%-*}
  7.   if [ X$OIP != X$IP ]
  8.   then
  9.      echo $OIP $N
  10.      N=1
  11.      OIP=$IP
  12.   else
  13.      let N=$N+1
  14.   fi
  15. done
  16. echo $OIP $N
复制代码


[color="Magenta"]sort ips | ips.sh
输出信息:
0
192.168.1.235 6
236.82.28.12 4

[color="Magenta"]思路:
OIP=
N=0
先用两个变量分别保存IP和数量
依次从文件中读信息,并提取出IP  ${IP%%-*}
如果IP与OIP相同,就将N的值加1,否则,打印出OIP和N的值,然后用OIP保存新的IP,同时置N的值为1
循环结束后,要打印出OIP和N,否则会丢失一个IP


[color="Magenta"]下面还有一个一句话的解决方案

  1. for IP in $(while read IP ; do echo ${IP%%-*} ; done < ips | sort -u) ; do echo $IP $(grep ^$IP ips | wc -l) ; done
复制代码

[color="Magenta"]分析:
while read IP .....   < ips  从ips这个文件中读信息,每次一行,读到IP这个变量中
${IP%%-*}  取每行 - 前面的部分(IP部分)
| sort -u 把输出结果进行唯一排序
$(while .... ) 这个shell子进程输出了唯一的IP
for IP in $(...) ... done  依次获取子进程输出的唯一IP并进行处理
grep ^$IP ips 从ips这个文件中提取所有以IP开头的行
|wc -l 把提取出来的行汇总



[color="Blue"]写得不好,权当抛砖引玉,以期引出更简洁,更精彩的方法
回复 支持 反对

使用道具 举报

发表于 2007-8-31 17:51:22 | 显示全部楼层

  1. | sort | (while read i; do [ x${i%%-*} == "${k//_/.}" ] || { [ -n "$k" ] && echo ${k#x}: ${!k};}; k=${i%%-*}; k=x${k//./_};let ${k}=${!k}+1; done; echo  ${k#x}: ${!k};)
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-8-31 17:57:48 | 显示全部楼层
这样不知道可不可以:
cat ./ip | cut -f1 -d- | sort -k1 | uniq -d -c
回复 支持 反对

使用道具 举报

发表于 2007-8-31 18:00:32 | 显示全部楼层
cool:)
回复 支持 反对

使用道具 举报

发表于 2007-9-1 12:15:33 | 显示全部楼层
Post by jellychen
这样不知道可不可以:
cat ./ip | cut -f1 -d- | sort -k1 | uniq -d -c



自惭形秽呀

这么简单的解决办法,我写了一大堆
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-3 14:11:52 | 显示全部楼层

小弟问题解决了!太感激不进了!

小弟问题解决了!太感激不进了!
回复 支持 反对

使用道具 举报

发表于 2007-9-15 22:44:36 | 显示全部楼层
  1. awk 'BEGIN { FS = "-" } { print $1 }' new | sort  -n | uniq -c
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表