考虑以下示例:
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'
但它给了我中间多余的文字。 我将如何检索我需要的两个字符串?
答案 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:
$ 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