免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1773 | 回复: 9

请教怎么用perl处理文本取值 [复制链接]

论坛徽章:
0
发表于 2016-02-29 21:56 |显示全部楼层
本帖最后由 xylonxiang 于 2016-02-29 22:36 编辑

文本数据如下:
2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!pay_jmsqueue_01] ConsumersHighCount:[1] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[10] MessagesReceivedCount:[373184] ConsumersTotalCount:[1]
2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!Queue-urm-log] ConsumersHighCount:[1] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[4] MessagesReceivedCount:[126072] ConsumersTotalCount:[1]
2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!Queue-pay-log] ConsumersHighCount:[0] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[0] MessagesReceivedCount:[0] ConsumersTotalCount:[0]
2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!pay_deadqueue] ConsumersHighCount:[0] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[0] MessagesReceivedCount:[0] ConsumersTotalCount:[0]


我想把文本格式化成下面这样,即取"[]"中的值请问这用perl怎么处理呢?谢谢!
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!pay_jmsqueue_01|1|0|0|10|373184|1

用一个pl脚本来处理也行

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-12 06:20:00
发表于 2016-02-29 23:36 |显示全部楼层
'1668 59 3. 7 1713 45 2. 7 1766 53 3. 1 1835 69 3. 9'
这种按4个数据一组怎么处理

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-03-01 00:48 |显示全部楼层
本帖最后由 RE_HASH 于 2016-03-01 00:51 编辑


$> cat aa|perl -ne '($T)= /^(.+?:\d\d) /; @V = /\[(.+?)\]/g; printf "$T|%s\n", join "|", @V;'
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!pay_jmsqueue_01|1|0|0|10|373184|1
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!Queue-urm-log|1|0|0|4|126072|1
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!Queue-pay-log|0|0|0|0|0|0
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!pay_deadqueue|0|0|0|0|0|0

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-03-01 10:46 |显示全部楼层
回复 3# RE_HASH
能想您问下, -n 在这里的作用吗?

   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-03-02 01:02 |显示全部楼层
$> perl -h

Usage: perl [switches] [--] [programfile] [arguments]
  -0[octal]         specify record separator (\0, if no argument)
  -a                autosplit mode with -n or -p (splits $_ into @F)
  -C[number/list]   enables the listed Unicode features
  -c                check syntax only (runs BEGIN and CHECK blocks)
  -d[:debugger]     run program under debugger
  -D[number/list]   set debugging flags (argument is a bit mask or alphabets)
  -e program        one line of program (several -e's allowed, omit programfile)
  -E program        like -e, but enables all optional features
  -f                don't do $sitelib/sitecustomize.pl at startup
  -F/pattern/       split() pattern for -a switch (//'s are optional)
  -i[extension]     edit <> files in place (makes backup if extension supplied)
  -Idirectory       specify @INC/#include directory (several -I's allowed)
  -l[octal]         enable line ending processing, specifies line terminator
  -[mM][-]module    execute "use/no module..." before executing program
  -n                assume "while (<>) { ... }" loop around program
  -p                assume loop like -n but print line also, like sed
  -s                enable rudimentary parsing for switches after programfile
  -S                look for programfile using PATH environment variable
  -t                enable tainting warnings
  -T                enable tainting checks
  -u                dump core after parsing program
  -U                allow unsafe operations
  -v                print version, patchlevel and license
  -V[:variable]     print configuration summary (or a single Config.pm variable)
  -w                enable many useful warnings
  -W                enable all warnings
  -x[directory]     ignore text before #!perl line (optionally cd to directory)
  -X                disable all warnings

Run 'perldoc perl' for more help with Perl.

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-03-02 12:21 |显示全部楼层
回复 5# RE_HASH
谢谢大神帮助, 向您学习!

   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
发表于 2016-03-04 23:26 |显示全部楼层
本帖最后由 stanley_tam 于 2016-03-04 23:27 编辑

来一发不用正则表达式的
  1. #!perl
  2. use strict;
  3. use warnings;
  4. use autodie;

  5. # input file name
  6. my $file = 'a.txt';

  7. open my $fh, '<', $file;
  8. while ( defined (my $line  = readline $fh) ) {
  9.     # body...
  10.     chomp $line;
  11.     my $replacement        = q{};
  12.     my $date               = substr $line, 0, 19, $replacement;
  13.    
  14.     my $is_in_bracket      = 0;
  15.     my $str_within_bracket = q{};

  16.     my $line_needed        = $date;

  17.     for my $char ( unpack("U*", $line) ){
  18.         $char = pack('U', $char);

  19.         if ( $char eq '[' ) {
  20.             $is_in_bracket       = 1;
  21.             $str_within_bracket  = q{};
  22.         }
  23.         elsif ( $char eq ']' ){
  24.             $is_in_bracket       = 0;
  25.             $line_needed        .= "|$str_within_bracket";
  26.         }
  27.         elsif ( $is_in_bracket ) {
  28.             $str_within_bracket .= $char;
  29.         }
  30.         else {
  31.             # do nothing
  32.         }
  33.     }

  34.     print "$line_needed$/";
  35. }
  36. close $fh;


  37. __END__
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-03-04 23:53 |显示全部楼层
我也来个 map 操作符的:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. print map {join ('|', join (' ', (split)[0,1]), m/\[([^\]]*)\]/g), "\n"} <DATA>;

  5. __DATA__
  6. 2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!pay_jmsqueue_01] ConsumersHighCount:[1] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[10] MessagesReceivedCount:[373184] ConsumersTotalCount:[1]
  7. 2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!Queue-urm-log] ConsumersHighCount:[1] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[4] MessagesReceivedCount:[126072] ConsumersTotalCount:[1]
  8. 2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!Queue-pay-log] ConsumersHighCount:[0] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[0] MessagesReceivedCount:[0] ConsumersTotalCount:[0]
  9. 2016-02-26 17:29:42 Type:[JMSDestination] Name:[pay_jmsmodule_01!pay_deadqueue] ConsumersHighCount:[0] MessagesCurrentCount:[0] MessagesPendingCount:[0] MessagesHighCount:[0] MessagesReceivedCount:[0] ConsumersTotalCount:[0]
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2016-03-05 23:55 |显示全部楼层
回复 3# RE_HASH

good, very good
3 Q ~
   

论坛徽章:
6
15-16赛季CBA联赛之新疆
日期:2016-03-22 22:34:5915-16赛季CBA联赛之山东
日期:2016-04-11 09:08:41程序设计版块每日发帖之星
日期:2016-06-28 06:20:00程序设计版块每日发帖之星
日期:2016-07-19 06:20:00每日论坛发贴之星
日期:2016-07-19 06:20:0015-16赛季CBA联赛之青岛
日期:2016-07-20 22:44:17
发表于 2016-03-09 04:04 |显示全部楼层
$> cat aa|perl -npe ' s/( Type:\[)|(\].+?\[)|(\])/{($3)? "":"|"}/ge'
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!pay_jmsqueue_01|1|0|0|10|373184|1
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!Queue-urm-log|1|0|0|4|126072|1
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!Queue-pay-log|0|0|0|0|0|0
2016-02-26 17:29:42|JMSDestination|pay_jmsmodule_01!pay_deadqueue|0|0|0|0|0|0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2021中国系统架构师大会

【数字转型 架构重塑】2021年5月20日-22日第十三届中国系统架构师大会将在云端进行网络直播。

大会为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议组织来说绝非易事;但考虑到云端会议的直播形式可以实现全国各地技术爱好者的参与,也使ITPUB作为技术共享交流平台得到更好的普及,我们决定迎难而上。
http://sacc.it168.com/


大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP