Bash,从文本文件中检索两组特定字符串

时间:2013-11-01 19:59:47

标签: bash

考虑以下示例:

Feb 14 26:00:01 randomtext here mail from user10@mailbox.com more random text
Feb 15 25:08:82 randomtext random text mail from user8@mailbox.com more random text
Jan 20 26:23:89 randomtext iortest test test mail from user6@mailbox.com more random
Mar 15 18:23:01 randomtext here mail from user4@mailbox.com more random text
Jun 15 20:04:01 randomtext here mail from user10@mailbox.com more random text

使用BASH我试图检索时间戳的第一部分,例如' 26' ' 25'以及用户的电子邮件,例如' user10@mailbox.com'

输出大致如下:

26 user10@mailbox.com
25 user8@mailbox.com
26 user6@mailbox.com
18 user4@mailbox.com
20 user10@mailbox.com

我尝试过使用:

cat myfile | grep -o '[0-9][0-9].*.com'

但它给了我中间多余的文字。 我将如何检索我需要的两个字符串?

4 个答案:

答案 0 :(得分:3)

sed与捕获组一起使用,以选择所需的部分。

sed 's/^.* \([0-9][0-9]\):.* mail from \(.*@.*\.com\).*/\1 \2/' myfile
  • ^ =行首
  • .* =任意字符序列后跟空格
  • \([0-9[0-9]\): = 2位数后跟冒号。数字将保存在捕获组#1
  • .* mail from =任意序列,后跟mail from和另一个空格
  • \(.*@.*\.com\) =任何序列后跟@,后跟任何序列,最多.com。这将保存在捕获组#2
  • .* =任何序列;这将匹配行的其余部分

匹配的所有内容(整行)将被捕获组#1,空间和捕获组#2取代。

答案 1 :(得分:0)

尝试

cat myfile | awk '{print $3, $8}' | sed 's/:[0-9][0-9]//g'

免责声明:我的awk技能生疏 - 应该有办法在awk中完全执行此操作,而无需诉诸sed

答案 2 :(得分:0)

使用

$ perl -lne '
    print "$1 $2" if /^\w+\s+\d+\s+(\d+):\d+:\d+\s+.*?([-\w\.]+@\S+)/
' file.txt

输出:

26 0@mailbox.com
25 8@mailbox.com
26 6@mailbox.com
18 4@mailbox.com
20 0@mailbox.com

答案 3 :(得分:0)

如果您的所有电子邮件地址都只有域名.com - 使用sed的上一个答案是完美的。 但是如果你可以拥有不同的域名,那么最好改进这个sed:

sed 's/^.* \([0-9][0-9]\):.* mail from \(.*@.*\..*\)\ more.*/\1 \2/' file