免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: send_linux
打印 上一主题 下一主题

正则表达进阶大讨论!欢迎参与讨论!(获奖名单已公布-2012-7-6) [复制链接]

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
31 [报告]
发表于 2012-06-01 18:05 |只看该作者
正则在工作中都是用于日志文件的分析,提取,替换一些文本处理的操作还有一块就是前端js 校验用户填写信息。支持正则的有很多 常用的grep awk sed perl py都行但是有些小的地方不一样,比如awk 就不能用\d只能用[0-9],sed用+需要加-r参数等等,确实比较讨厌。这其中咱一般都是统一成用perl这样对正则支持比较全面的,而且能够写得比较简单比如一行搞定的去处理。如果正则比较简单的话就好办了,随便用哪个都行。

论坛徽章:
0
32 [报告]
发表于 2012-06-01 18:30 |只看该作者
初学者,通配和正则总是有点混,在书上看grep仅支持正则,但是往往感觉我是在用通配,比如:grep abcde *.txt , 是为什么?

论坛徽章:
0
33 [报告]
发表于 2012-06-01 22:21 |只看该作者
强大的正则,正在学习!

论坛徽章:
2
双鱼座
日期:2013-08-23 17:05:08酉鸡
日期:2014-09-23 09:24:18
34 [报告]
发表于 2012-06-01 23:40 |只看该作者
1、在你的日常工作中会使用正则表达式解决什么样的问题?

像日志,网页,监控等涉及到字符串匹配和提取的地方,基本都会用正则。

2、正则表达式的用法在各个语言、脚本里面略有不同,你有什么学习经验可以分享给初学者?
grep,sed,awk,perl等都有正则,但比较悲催的是他们之间有不少不同,包括模式使用以及支持的符号。我在使用中基本上,不用除perl以外的写复杂的正则,并且把各个语言的正则教程下载下来,随用随看,因为实在是记不准这么多~~~

论坛徽章:
5
亥猪
日期:2013-10-15 13:41:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34申猴
日期:2013-10-28 10:55:45辰龙
日期:2013-10-31 13:29:29丑牛
日期:2014-02-14 11:25:54
35 [报告]
发表于 2012-06-01 23:46 |只看该作者
回复 32# xiakedz


    你看到的通配  实际上是bash的glob  grep正则处理的是前面那一个

论坛徽章:
0
36 [报告]
发表于 2012-06-02 00:35 |只看该作者
我到是遇见了这样一个问题,在使用perl  解析 bash命令输出时

问题是这样的,我想在我的程序中捕获一些命令的输出,然后做其它的操作,例如:
ps -ef 命令 产生如下

root       329     1  0 22:32 ?        00:00:00 upstart-udev-bridge --daemon
root       338     1  0 22:32 ?        00:00:00 udevd --daemon
root       462   338  0 22:32 ?        00:00:00 udevd --daemon
root       495   338  0 22:32 ?        00:00:00 udevd --daemon
root       543     2  0 22:32 ?        00:00:00 [kmemstick]
root       613     1  0 22:32 ?        00:00:00 upstart-socket-bridge --daemon
root       621     2  0 22:32 ?        00:00:00 [led_workqueue]
root       648     2  0 22:32 ?        00:00:00 [kpsmoused]
root       663     2  0 22:32 ?        00:00:00 [cfg80211]
root       736     2  0 22:32 ?        00:00:00 [ttm_swap]


分不同的列,现在我想捕获不同的列,默认分割符是 空格,我想替换它便于进行正则表达式的提取(不能用空格做的原因是有些列中含有空格)

怎么搞? 不知道是从命令中可以设置参数 还是可以设置 shell的变量? 效果可能如下:

root    %   543   %  2 %  0 % 22:32 ?    %    00:00:00 [kmemstick]
root     %  613    % 1 % 0  % 22:32 ?     %   00:00:00 upstart-socket-bridge --daemon
root      % 621    % 2  % 0 % 22:32 ?      %  00:00:00 [led_workqueue]
(按 %分割)



论坛徽章:
0
37 [报告]
发表于 2012-06-02 00:41 |只看该作者
1. 更改 bash 对于每一个列的默认空格分割符 而改用更特殊的字符分割
2. 使用通用的正则表达式可以考虑到如果列中含有空格的情况

当然第一种方法相对而言正则较好匹配,但是不知道如果更改,是可以统一更改还是每一个命令的输出可以定义?
本人目前没有找到第一中方法的解决,而是采用了一个折中的方法就是将含有空格的列放到最后的列,而匹配前面的,则剩下的就好匹配了!

不知道大神们还有没有其它方法?


论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
38 [报告]
发表于 2012-06-02 06:36 |只看该作者
回复 36# xiyoulaoyuanjia
  1. echo 'root       329     1  0 22:32 ?        00:00:00 upstart-udev-bridge --daemon
  2. root       338     1  0 22:32 ?        00:00:00 udevd --daemon
  3. root       462   338  0 22:32 ?        00:00:00 udevd --daemon
  4. root       495   338  0 22:32 ?        00:00:00 udevd --daemon
  5. root       543     2  0 22:32 ?        00:00:00 [kmemstick]
  6. root       613     1  0 22:32 ?        00:00:00 upstart-socket-bridge --daemon
  7. root       621     2  0 22:32 ?        00:00:00 [led_workqueue]
  8. root       648     2  0 22:32 ?        00:00:00 [kpsmoused]
  9. root       663     2  0 22:32 ?        00:00:00 [cfg80211]
  10. root       736     2  0 22:32 ?        00:00:00 [ttm_swap]' |\
  11. perl -nle 'push @arr,[@a=($_=~/^(\S+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\S+\s+\?)\s+(\S+)\s+(.*)$/)];
  12. END{map{print join "\t%\t",@{$_}}@arr}'
  13. root    %       329     %       1       %       0       %       22:32 ? %       00:00:00        %       upstart-udev-bridge --daemon
  14. root    %       338     %       1       %       0       %       22:32 ? %       00:00:00        %       udevd --daemon
  15. root    %       462     %       338     %       0       %       22:32 ? %       00:00:00        %       udevd --daemon
  16. root    %       495     %       338     %       0       %       22:32 ? %       00:00:00        %       udevd --daemon
  17. root    %       543     %       2       %       0       %       22:32 ? %       00:00:00        %       [kmemstick]
  18. root    %       613     %       1       %       0       %       22:32 ? %       00:00:00        %       upstart-socket-bridge --daemon
  19. root    %       621     %       2       %       0       %       22:32 ? %       00:00:00        %       [led_workqueue]
  20. root    %       648     %       2       %       0       %       22:32 ? %       00:00:00        %       [kpsmoused]
  21. root    %       663     %       2       %       0       %       22:32 ? %       00:00:00        %       [cfg80211]
  22. root    %       736     %       2       %       0       %       22:32 ? %       00:00:00        %       [ttm_swap]
复制代码

论坛徽章:
0
39 [报告]
发表于 2012-06-02 10:11 |只看该作者
支持,打算买本看看,现在正好用。

论坛徽章:
0
40 [报告]
发表于 2012-06-02 11:33 |只看该作者
关注一下下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP