1

考虑这个例子:

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

4 回答 4

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。

于 2013-11-01T20:04:17.717 回答
0

尝试

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

免责声明:我的awk技能生疏了-应该有一种方法可以仅在awk不诉诸于sed.

于 2013-11-01T20:04:10.387 回答
0

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

sed 's/^.* \([0-9][0-9]\):.* mail from \(.*@.*\..*\)\ more.*/\1 \2/' file
于 2013-11-02T10:45:04.687 回答
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
于 2013-11-01T20:17:45.447 回答