免费注册 查看新帖 |

Chinaunix

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

[文本处理] 文本处理求助 [复制链接]

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2014-08-23 07:38 |显示全部楼层
本帖最后由 bikkuri 于 2014-08-23 08:08 编辑

大家好!
我有几个问题向大家请教。
我有一些文本,想从中间提取一些信息。
以下是其中的一个文本。
N9Received: from cloudband-be.local (localhost [127.0.0.1])N:   by cloudband-be.local (Postfix) with ESMTP id 545615405FBN;     for <test@test.com>; Fri, 22 Aug 2014 00:54:12 +0000 (UTC)N+Date: Fri, 22 Aug 2014 00:54:12 +0000 (UTC)N
From: foo@cloud-band.comN
To: test@test.comNHMessage-ID: <346866564.3.1408668852344.JavaMail.ncos@cloudband-be.local>N/Subject: Your CloudBand password has been resetN
MIME-Version: 1.0N'Content-Type: text/plain; charset=UTF-8N
Content-Transfer-Encoding: 7bitN
Dear test test, N
Your password has been reset. N
Username:   test N
E-mail: test@test.com N
Password: EY3vNTKe N
NuTo protect the security of your account our customer service and support personnel will never ask for your password. N
Sincerely, N
CloudBand Customer ServiceX
我希望从这些文本中获取每个用户名、邮件、密码和日期,并以以下方式逐行输出:
  1. Username: test|E-mail: test@test.com|Password: EY3vNTKe|Date: Fri, 22 Aug 2014 00:54:12 +0000 (UTC)
复制代码
那么应该如何处理这些文本呢?
谢谢!

论坛徽章:
0
发表于 2014-08-23 09:38 |显示全部楼层
前排,哇咔咔

论坛徽章:
14
15-16赛季CBA联赛之辽宁
日期:2019-06-16 15:47:3515-16赛季CBA联赛之广夏
日期:2016-08-13 21:24:352015亚冠之武里南联
日期:2015-07-07 17:37:372015亚冠之萨济拖拉机
日期:2015-07-06 17:07:482015亚冠之全北现代
日期:2015-06-04 13:54:272015亚冠之城南
日期:2015-05-21 15:43:212015年亚洲杯之伊朗
日期:2015-04-25 18:20:362015年亚洲杯之伊朗
日期:2015-04-20 16:06:052015年亚洲杯之科威特
日期:2015-03-07 12:51:26丑牛
日期:2014-12-30 10:26:38申猴
日期:2014-09-28 22:40:18金牛座
日期:2014-09-13 21:12:22
发表于 2014-08-23 10:40 |显示全部楼层
  1. <?php

  2. $f = fopen('1.txt','r');
  3. $a = array();
  4. while( !feof($f)){
  5.    $line = fgets($f);
  6.    $pa = '/(Date:[^N]+)|(^Username:[^N]+)|(^E-mail:[^N]+)|(^Password:.* )/';
  7.     preg_match($pa,$line,$tmp);
  8.      if(!empty($tmp)){
  9.       $a[] = $tmp[0];
  10.       }
  11. }
  12. echo  $a[1]."|".$a[2]."|".$a[3]."|".$a[0]."\n";

  13. ?>

  14. Username:   test |E-mail: test@test.com |Password: EY3vNTKe |Date: Fri, 22 Aug 2014 00:54:12 +0000 (UTC)
复制代码

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2014-08-23 11:08 |显示全部楼层
膜拜充气大婶的拍黄片
回复 3# reb00t


   

论坛徽章:
8
戌狗
日期:2013-10-12 11:37:19双子座
日期:2014-05-06 14:40:39巨蟹座
日期:2014-06-14 09:22:18戌狗
日期:2014-09-18 16:05:44巨蟹座
日期:2014-12-27 16:37:26酉鸡
日期:2015-01-20 18:39:022015年亚洲杯之沙特阿拉伯
日期:2015-04-20 22:38:242015亚冠之萨济拖拉机
日期:2015-06-19 16:01:03
发表于 2014-08-23 11:10 |显示全部楼层
膜拜充气大婶的拍黄片
回复 3# reb00t


   

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2014-08-23 12:39 |显示全部楼层
本帖最后由 bikkuri 于 2014-08-23 13:08 编辑

非常感谢您的答复。
我没想到您是用php来做的,因为好像用awk,sed来做文本处理的比较多。
如果用php的话,我还想向您请教一下这个程序的输入的问题。
因为要处理的文件不是一个名为1.txt的文件,而是/var/spool/postfix/deferred/*/*。
另外由于这些文件中含有二进制的非ASCII字符,所以我是用strings命令做预处理将它们变成纯ASCII文本的。
所以在php程序中可以先执行一条system ("strings /var/spool/postfix/deferred/*/* > 1.txt"); 对吧?
但是这样的话,1.txt中会有很多个用户和密码,那php程序要如何修改以处理所有的数据呢?

reb00t 发表于 2014-08-23 10:40

论坛徽章:
7
天秤座
日期:2014-08-07 13:56:30丑牛
日期:2014-08-27 20:34:21双鱼座
日期:2014-08-27 22:02:21天秤座
日期:2014-08-30 10:39:11双鱼座
日期:2014-09-21 20:07:532015年亚洲杯之日本
日期:2015-02-06 14:00:282015亚冠之大阪钢巴
日期:2015-11-02 14:50:19
发表于 2014-08-23 13:00 |显示全部楼层
  1. grep -Po 'Username:.*(?=N)|E-mail:.*(?=N)|Password:.*(?=N)|Date:.*(?=N)' urfile | sed ':a N;s/\n/|/g;ta' | awk -F'|' '{print $2"|"$3"|"$4"|"$1}'
复制代码
比较笨,grep出来的顺序和最后输出的顺序不一致,而且有换行不会处理。。。。。。

hrg@linux-xb9s:~/work/shell> cat aaa
N9Received: from cloudband-be.local (localhost [127.0.0.1])N:   by cloudband-be.local (Postfix) with ESMTP id 545615405FBN;     for <test@test.com>; Fri, 22 Aug 2014 00:54:12 +0000 (UTC)N+Date: Fri, 22 Aug 2014 00:54:12 +0000 (UTC)N
From: foo@cloud-band.comN
To: test@test.comNHMessage-ID: <346866564.3.1408668852344.JavaMail.ncos@cloudband-be.local>N/Subject: Your CloudBand password has been resetN
MIME-Version: 1.0N'Content-Type: text/plain; charset=UTF-8N
Content-Transfer-Encoding: 7bitN
Dear test test, N
Your password has been reset. N
Username:   test N
E-mail: test@test.com N
Password: EY3vNTKe N
NuTo protect the security of your account our customer service and support personnel will never ask for your password. N
Sincerely, N
CloudBand Customer ServiceX
hrg@linux-xb9s:~/work/shell> grep -Po 'Username:.*(?=N)|E-mail:.*(?=N)|Password:.*(?=N)|Date:.*(?=N)' aaa | sed ':a N;s/\n/|/g;ta' | awk -F'|' '{print $2"|"$3"|"$4"|"$1}'
Username:   test |E-mail: test@test.com |Password: EY3vNTKe |Date: Fri, 22 Aug 2014 00:54:12 +0000 (UTC)
hrg@linux-xb9s:~/work/shell>

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2014-08-23 13:28 |显示全部楼层
本帖最后由 bikkuri 于 2014-08-23 17:10 编辑

谢谢您的答复,但是好像在处理文本的时候,一部分可以得到正确的输出,另一部分则得不到正确的输出。
以下是一个没有得到正确输出的文本的例子:
N)Received: by cloudband-be.local (Postfix)N6   id E9C79540610; Fri, 22 Aug 2014 08:21:04 +0000 (UTC)N+Date: Fri, 22 Aug 2014 08:21:
04 +0000 (UTC)
N=From: MAILER-DAEMON@cloudband-be.local (Mail Delivery System)N,Subject: Undelivered Mail Returned to SenderN
To: foo@cloud-band.comN
Auto-Submitted: auto-repliedN
MIME-Version: 1.0N<Content-Type: multipart/report; report-type=delivery-status;N5       boundary="571345405FA.1408695664/cloudband-b
e.local"N;Message-Id: <20140822082104.E9C79540610@cloudband-be.local>N
N$This is a MIME-encapsulated message.N
N+--571345405FA.1408695664/cloudband-be.localN!Content-Description: NotificationN*Content-Type: text/plain; charset=us-asciiN
N3This is the mail system at host cloudband-be.local.N
N;I'm sorry to have to inform you that your message could notN<be delivered to one or more recipients. It's attached below.N
N7For further assistance, please send mail to postmaster.N
N9If you do so, please include this problem report. You canN8delete your own text from the attached returned message.N
N"                   The mail systemN
N#<kiyoshi.amemiya@ibm.com>: hostNB    usnavsmail1.ndc.ibm.com[135.3.39.9] said: 550 5.7.1NK    <kiyoshi.amemiya@ibm.com>...
Fix reverse DNS for 135.254.61.241 (inN
     reply to RCPT TO command)N
N+--571345405FA.1408695664/cloudband-be.localN$Content-Description: Delivery reportN%Content-Type: message/delivery-statusN
N&Reporting-MTA: dns; cloudband-be.localN
X-Postfix-Queue-ID: 571345405FAN,X-Postfix-Sender: rfc822; foo@cloud-band.comN3Arrival-Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)N
N4Final-Recipient: rfc822; kiyoshi.amemiya@ibm.comN6Original-Recipient: rfc822;kiyoshi.amemiya@ibm.comN
Action: failedN
Status: 5.7.1N3Remote-MTA: dns; usnavsmail1.ndc.ibm.comNMDiagnostic-Code: smtp; 550 5.7.1 <kiyoshi.amemiya@ibm.com>..
. Fix reverseN
     DNS for 135.254.61.241N
N+--571345405FA.1408695664/cloudband-be.localN(Content-Description: Undelivered MessageN
Content-Type: message/rfc822N
N!Return-Path: <foo@cloud-band.com>N9Received: from cloudband-be.local (localhost [127.0.0.1])N:        by cloudband-be.local (Postf
ix) with ESMTP id 571345405FANI for <kiyoshi.amemiya@ibm.com>; Fri, 22 Aug 2014 08:21:01 +0000 (UTC)N+Date: Fri, 22 Aug 2014 08:
21:01 +0000 (UTC)
N
From: foo@cloud-band.comN
To: kiyoshi.amemiya@ibm.comNIMessage-ID: <1575957485.9.1408695661356.JavaMail.ncos@cloudband-be.local>N/Subject: Your CloudBand
password has been resetN
MIME-Version: 1.0N'Content-Type: text/plain; charset=UTF-8N
Content-Transfer-Encoding: 7bitN
Dear amemiya kiyoshi, N
Your password has been reset. N
Username:   kamemiya N$E-mail: kiyoshi.amemiya@ibm.com N
Password: fpMMduNF N
NuTo protect the security of your account our customer service and support personnel will never ask for your password. N
Sincerely, N
CloudBand Customer ServiceN
N---571345405FA.1408695664/cloudband-be.local--X
处理的结果是:
[root@cloudband-be E]# strings *|grep -Po 'Username:.*(?=N)|E-mail:.*(?=N)|Password:.*(?=N)|Date:.*(?=N)' | sed ':a N;s/\n/|/g;ta' |
awk -F'|' '{print $2"|"$3"|"$4"|"$1}'
Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)|Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)|Username:   kamemiya N$E-mail: kiyoshi.amemi
ya@ibm.com |Date: Fri, 22 Aug 2014 08:21:04 +0000 (UTC)N=From: MAILER-DAEMON@cloudband-be.local (Mail Delivery System)N,Subject: Und
elivered Mail Returned to Sender
我看了一下,我看了一下出错的原因是因为输入的源文件中有三个Date。
[root@cloudband-be E]# strings E9C79540610 |grep -c "Date"
3
能不能只处理最靠近Username的那个?
我用您的grep命令的部分可以得到以下结果。
  1. [root@cloudband-be deferred]# strings */*|grep -Po 'Username:.*(?=N)|E-mail:.*(?=N)|Password:.*(?=N)|Date:.*(?=N)'
  2. Date: Fri, 22 Aug 2014 00:53:55 +0000 (UTC)
  3. Username:       test
  4. E-mail: test@test.com
  5. Password: NVuUCIgb
  6. Date: Fri, 22 Aug 2014 00:56:13 +0000 (UTC)N=From: MAILER-DAEMON@cloudband-be.local (Mail Delivery System)N,Subject: Undelivered Mail Returned to Sender
  7. Date: Fri, 22 Aug 2014 00:56:00 +0000 (UTC)
  8. Date: Fri, 22 Aug 2014 00:56:00 +0000 (UTC)
  9. Username:       kamemiya N$E-mail:  kiyoshi.amemiya@ibm.com
  10. Password: qyBe0Qwm
  11. Date: Sat, 23 Aug 2014 06:32:49 +0000 (UTC)N=From: MAILER-DAEMON@cloudband-be.local (Mail Delivery System)N,Subject: Undelivered Mail Returned to Sender
  12. Date: Mon, 18 Aug 2014 05:36:18 +0000 (UTC)
  13. Date: Mon, 18 Aug 2014 05:36:18 +0000 (UTC)
  14. Username:       demo
  15. E-mail: demo.taro@demo.com
  16. Password: A4qMoHko
  17. Date: Fri, 22 Aug 2014 08:21:04 +0000 (UTC)N=From: MAILER-DAEMON@cloudband-be.local (Mail Delivery System)N,Subject: Undelivered Mail Returned to Sender
  18. Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  19. Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
  20. Username:       kamemiya N$E-mail:  kiyoshi.amemiya@ibm.com
  21. Password: fpMMduNF
复制代码
然后应该如何处理,可以得到以下结果呢?
  1. Username: test |E-mail: test@test.com |Password: NVuUCIgb |Date: Fri, 22 Aug 2014 00:53:55 +0000 (UTC)
  2. Username: kamemiya |E-mail: kiyoshi.amemiya@ibm.com |Password: qyBe0Qwm |Date: Fri, 22 Aug 2014 00:56:00 +0000 (UTC)
  3. Username: demo |E-mail: demo.taro@demo.com |Password: A4qMoHko |Date: Mon, 18 Aug 2014 05:36:18 +0000 (UTC)
  4. Username: kamemiya |E-mail:  kiyoshi.amemiya@ibm.com |Password: fpMMduNF |Date: Fri, 22 Aug 2014 08:21:01 +0000 (UTC)
复制代码
谢谢。

回复 7# MeRcy_PM


   

论坛徽章:
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
发表于 2014-08-23 14:34 |显示全部楼层
  1. awk -v OFS="|" -v FPAT='(Date|Username|Password|E-mail):[^N]*' '{for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}' urfile
复制代码

论坛徽章:
18
辰龙
日期:2014-05-21 21:01:4115-16赛季CBA联赛之深圳
日期:2016-12-23 13:51:3815-16赛季CBA联赛之北控
日期:2016-11-28 18:26:3815-16赛季CBA联赛之佛山
日期:2016-11-03 11:18:5815-16赛季CBA联赛之辽宁
日期:2016-07-10 16:09:4115-16赛季CBA联赛之江苏
日期:2016-02-20 23:09:202015亚冠之塔什干棉农
日期:2015-08-17 19:49:492015年亚洲杯之日本
日期:2015-04-30 01:24:342015年亚洲杯之约旦
日期:2015-04-01 00:37:182015年亚洲杯之沙特阿拉伯
日期:2015-03-02 15:55:40处女座
日期:2014-05-25 10:34:0020周年集字徽章-年
日期:2023-04-23 11:17:52
发表于 2014-08-23 15:23 |显示全部楼层
本帖最后由 bikkuri 于 2014-08-23 15:30 编辑

谢谢您的答复。
但是好像执行后出错。
  1. [root@cloudband-be E]# strings E9C79540610 |awk -v OFS="|" -v FPAT='(Date|Username|Password|E-mail):[^N]*' '{for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}'
  2. awk: {for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}
  3. awk:                              ^ syntax error
  4. awk: {for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}
  5. awk:                                          ^ syntax error
  6. awk: {for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}
  7. awk:                                                                      ^ syntax error
  8. awk: {for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}
  9. awk:                                                                                                 ^ syntax error
  10. awk: {for(i=1;i<=NF;i++)switch($i){case /Date/: d=$i;break;case /Username/:u=$i;break;case /Password/: p=$i;break;case /E-mail/: e=$i;} }END{print u,e,p,d}
  11. awk:                                                                                                                           ^ syntax error
  12. [root@cloudband-be E]#
复制代码
blackold 发表于 2014-08-23 14:34
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP