免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4656 | 回复: 11
打印 上一主题 下一主题

如何在文本中筛选ip地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-30 21:02 |只看该作者 |倒序浏览
假设在一个文件中,ip地址xxx.xxx.xxx.xxx有可能在换行处被分开,
即有如下几种形式:

---xxx.xxx.xxx.xxx--

-------xxx.xxx.xxx.xx
x

-----------------------x
xx.xxx.xxx

---------------------xxx.
xxx.xxx.xxx

x表示数字,每个ip段范围是0—255,----表示其他文本内容

如何将这个ip地址筛选出来呢?希望大家帮忙,谢谢。

论坛徽章:
0
2 [报告]
发表于 2009-04-30 21:23 |只看该作者
如果“其他字符串”中没有1.2.3.4这样的干扰因素,这个应该可以:

  1. sed -nr '/^$/!N;s/\n//gp' URFILE | egrep -o '[0-9]{1,3}(\.[0-9]{1,3}){3}'
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-04-30 21:34 |只看该作者

回复 #2 kwokcn 的帖子

实在是太厉害了,这么快就解决了。

那么如何查找在文件中是否存在某个ip呢?即ip是已知的

表达式正在学习中。

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
4 [报告]
发表于 2009-04-30 21:51 |只看该作者

回复 #2 kwokcn 的帖子

这是不是会漏掉一些,如
abc
abc 192.168.0
.1 ip

论坛徽章:
0
5 [报告]
发表于 2009-04-30 21:51 |只看该作者

  1. sed -nr '/^$/!N;s/\n//gp' URFILE | grep -o 'IP' >/dev/null 2>&1
  2. if [[ "$?" == "1" ]]; then
  3.         echo "This IP is not found !"
  4. else
  5.         echo "This IP is found !"
  6. fi
复制代码

论坛徽章:
0
6 [报告]
发表于 2009-04-30 22:01 |只看该作者
原帖由 blackold 于 2009-4-30 21:51 发表
这是不是会漏掉一些,如
abc
abc 192.168.0
.1 ip

呃,又看了一下楼主的例子,原来是说有以下情况……
我还以为文件格式就是那样的。

如果有黑哥说的这种情况就只能全文处理了,得把前面的sed部分换成这个:

  1. sed -nr 'H;${g;s/\n//gp}' URFILE
复制代码

[ 本帖最后由 kwokcn 于 2009-4-30 22:03 编辑 ]

论坛徽章:
0
7 [报告]
发表于 2009-04-30 22:06 |只看该作者

回复 #4 blackold 的帖子

确实是漏掉了,blackold可以给出更好的解决方法吗?

另外有两个问题,在sed -nr '/^$/!N;s/\n//gp' 中
/^$/!N的意思是不是如果没有到行尾,就将下一行追加到上一行上,
s/\n//gp中g是什么意思呢,我还正在看教材,不是很明白,希望大家可以具体讲解

论坛徽章:
0
8 [报告]
发表于 2009-04-30 22:11 |只看该作者
原帖由 fqy222425 于 2009-4-30 22:06 发表
确实是漏掉了,blackold可以给出更好的解决方法吗?

另外有两个问题,在sed -nr '/^$/!N;s/\n//gp' 中
/^$/!N的意思是不是如果没有到行尾,就将下一行追加到上一行上,
s/\n//gp中g是什么意思呢,我还正在 ...

解决方法上面给了。不过如果处理大文件可能效率不好,实在不行可以找找perl的解决方法,或者干脆就用C++的boost库解决了。

/^$/是说空行,/^$/!N是说如果不是空行就把下一行追加到sed的pattern space里处理。
s/\n//gp的g其实只是我的小习惯,其实在这个代码里没用……g在这里指全文替换,不加g只替换第一个匹配项,加g替换所有匹配项。

论坛徽章:
0
9 [报告]
发表于 2009-04-30 22:16 |只看该作者

回复 #8 kwokcn 的帖子

问题解决了,谢谢

论坛徽章:
0
10 [报告]
发表于 2009-04-30 22:30 |只看该作者
我为啥用sed呢……用 tr -d '\n' < URFILE 就行了,糊涂…… - -
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP