免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3841 | 回复: 15

用egrep多条件过滤效率低,有什么好的推荐吗? [复制链接]

论坛徽章:
0
发表于 2012-05-25 11:37 |显示全部楼层
昨天在另外一个版块发了这篇文章,现在发在shell版问问各位大侠~~~

egrep 多条件过滤的效率问题,有没好的代替方法?
http://bbs.chinaunix.net/forum.p ... mp;fromuid=21879027



egrep 多条件过滤的效率问题,有没好的代替方法?

dump_test_file.sql 文件大小4.2GB
1.过滤单个条件:
$ time cat -n dump_test_file.sql |egrep "CREATE DATABASE \/\*\!32312 IF NOT EXISTS\*\/"
  2326  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
10594  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET latin1 */;
14254  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db3` /*!40100 DEFAULT CHARACTER SET utf8 */;

real    0m11.936s
user    0m7.358s
sys     0m12.659s

2.过滤单个条件
$ time cat -n dump_test_file.sql |egrep "Dump completed on"
14628  -- Dump completed on 2012-05-19  4:01:32

real    0m12.569s
user    0m8.986s
sys     0m11.718s

3.合并过滤上面2个条件:
$ time cat -n dump_test_file.sql |egrep "CREATE DATABASE \/\*\!32312 IF NOT EXISTS\*\/|Dump completed on"
  2326  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db1` /*!40100 DEFAULT CHARACTER SET utf8 */;
10594  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db2` /*!40100 DEFAULT CHARACTER SET latin1 */;
14254  CREATE DATABASE /*!32312 IF NOT EXISTS*/ `db3` /*!40100 DEFAULT CHARACTER SET utf8 */;
14628  -- Dump completed on 2012-05-19  4:01:32

real    3m8.444s
user    3m3.850s
sys     0m13.049s

为什么第三次执行的时间,比前面2次时间相加还久???

还好egrep 过滤3个或更多条件时,过滤的时间跟2个条件差不多 。。。
上面执行过滤的时候用了cat -n 是因为需要知道过滤出来的结果的所在行号;若直接用egrep的话,执行速度会快5%左右;

还测试一下,过滤一个230GB的文件,单个条件的过滤需要19分钟,当时的IO 读 220rMB/s,egrep 单线程cpu使用率大约20%;而过滤2个(或2个以上)条件的话,则大概需要3小时,当时IO 读 23rMB/s,egrep 单线程cpu使用率大约90%;

用egrep多条件过滤效率低,有什么好的推荐吗?

或者说,需要过滤出某字符串以及显示所在的行号,有什么方法比较快吗?  sed & awk ?

论坛徽章:
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
发表于 2012-05-25 11:56 |显示全部楼层
grep -n 就可以显示行号啊。

论坛徽章:
13
15-16赛季CBA联赛之同曦
日期:2016-01-28 19:52:032015亚冠之北京国安
日期:2015-10-07 14:28:19NBA常规赛纪念章
日期:2015-05-04 22:32:03处女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午马
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56狮子座
日期:2013-09-08 08:37:52
发表于 2012-05-25 12:17 |显示全部楼层

  1. AWK就能显示行号
  2. > cat aa.txt
  3. ID        NAME                        STATE
  4. ---------------------------------------
  5. 2        ubuntu-1204-test-02        running
  6. 33        mini-02                        running
  7. 34        XCP                        running
  8. 35        mini-05                        running
  9. 36        mini-03                        running
  10. > awk '{print NR,$0}' aa.txt
  11. 1 ID        NAME                        STATE
  12. 2 ---------------------------------------
  13. 3 2        ubuntu-1204-test-02        running
  14. 4 33        mini-02                        running
  15. 5 34        XCP                        running
  16. 6 35        mini-05                        running
  17. 7 36        mini-03                        running
复制代码
回复 1# wjlcn


   

论坛徽章:
0
发表于 2012-05-25 12:20 |显示全部楼层
正则表达式有分支的话的确很慢.你可以看看<精通正则表达式>这本书里介绍的.

你试试-P看看能不能好一些

论坛徽章:
0
发表于 2012-05-25 13:23 |显示全部楼层
fgrep == fast grep

论坛徽章:
5
未羊
日期:2014-08-04 16:15:21天秤座
日期:2014-08-13 13:52:372015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:112015亚冠之浦和红钻
日期:2015-06-29 15:30:48
发表于 2012-05-25 15:22 |显示全部楼层
干啥都先cat。。。。。。把这个省去应该还能快些

论坛徽章:
0
发表于 2012-05-25 15:53 |显示全部楼层
回复 4# mpstat


    当年也看过一下关于perl的正则表达式的,基本上忘了,久了没用就很容易忘记,呵呵
在这里加上-P确实快了些,谢谢~~


加上cat -n 是没注意到grep也有-n参数,呵呵。。。

论坛徽章:
0
发表于 2012-05-25 16:12 |显示全部楼层
回复 7# wjlcn


    你还好意思说加-P更快

论坛徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年纪念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役纪念章
日期:2022-04-24 14:33:24
发表于 2012-05-25 16:23 |显示全部楼层
回复 7# wjlcn


    fgrep耗时多少?

论坛徽章:
0
发表于 2012-05-25 16:31 |显示全部楼层
回复 8# __lxmxn__


    哪里说错了吗?请指教。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP