免费注册 查看新帖 |

Chinaunix

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

(求助)如何在文件中多关键字查找? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-20 17:27 |只看该作者 |倒序浏览
张三123456注册
砖瓦上上上
34李四3注册56
地区性上下班
王五地地注册区性


假设有个数组@a=(张三 李四 王五)
数组内的各个值都是关键字
我想先从数组提取关键字然后同时在文件中查找含有关键字的行而不是用循环一个一个查,这样没有效率呢

open(DATA,"/tmp/1");
@a=(张三 李四 王五);
while(<DATA>){
if($_=~/注册/ and )

}


我要怎么写呢,多谢大家,给出个主意。

[ 本帖最后由 tanxin8651 于 2009-3-20 17:30 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-03-20 18:33 |只看该作者
把你的关键字并起来,做成一个 regexp

论坛徽章:
0
3 [报告]
发表于 2009-03-20 18:55 |只看该作者
做一个简单的正则确实可以解决问题的,但是如果是上千个关键字,这个就是不好实现了,我其实就在卡在这里了,还请继续指点下。
意思就是只读一遍文件而把所有匹配的行打印出来。

[ 本帖最后由 tanxin8651 于 2009-3-20 18:57 编辑 ]

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
4 [报告]
发表于 2009-03-20 19:03 |只看该作者
如果每一行你能有办法分离成一个个的词的话
把关键字表做个hash
分离出一个词后看看有没有在hash中

论坛徽章:
0
5 [报告]
发表于 2009-03-20 19:15 |只看该作者
原帖由 yecheng_110 于 2009-3-20 19:03 发表
如果每一行你能有办法分离成一个个的词的话
把关键字表做个hash
分离出一个词后看看有没有在hash中

是的,这样也可以解决问题,但是这样做的话,还是需要多次读文件吧,其实我做的工作就是要分析日志中的数据呢,如果这些有关键字的行在多个目录的文件下的话,多次读取文件,再加上关键字也有上千个,这样做多个循环,查出来时间会很长,所以就想每个文件只读一次,其实就是想实现类似awk 或grep 这样的功能,就是同时查找多个关键字

awk '/关键字1/||/关键字2/||/关键字3/  file

grep   '关键字1\|关键字2\|关键字3' file

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
6 [报告]
发表于 2009-03-20 20:20 |只看该作者
  1. @keys = qw/张三 李四 朱元璋 李自成/;
  2. open FH,"<","yourlog.log" or die "open file failure.\n";
  3. while (<FH>){
  4.     $line = $_;
  5.     foreach (@keys){
  6.         if ($line =~ /$_/){
  7.             print $line;
  8.             last;
  9.         }
  10.     }
  11. }
  12. close FH;
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2009-03-20 20:56 |只看该作者
原帖由 tanxin8651 于 2009-3-20 19:15 发表

是的,这样也可以解决问题,但是这样做的话,还是需要多次读文件吧,

为什么需要多次读入文件?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
8 [报告]
发表于 2009-03-20 20:57 |只看该作者
原帖由 yecheng_110 于 2009-3-20 19:03 发表
如果每一行你能有办法分离成一个个的词的话
把关键字表做个hash
分离出一个词后看看有没有在hash中

这也是个办法。

论坛徽章:
0
9 [报告]
发表于 2009-03-24 18:46 |只看该作者
谢谢各位,这个问题解决了.

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
10 [报告]
发表于 2009-03-24 21:44 |只看该作者
原帖由 tanxin8651 于 2009-3-24 18:46 发表
谢谢各位,这个问题解决了.

也说说你怎么解决的撒?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP