从文件中提取信息以创建表

时间:2013-01-29 18:55:01

标签: bash shell sed awk

Jan 29 12:28:17 torsmtp2 postfix/cleanup[16193]: 5513512078E: warning: header Subject: Well Systems - Project Updated (Published Number 561-639-2188) from unknown[10.40.6.11]; from=<Accounts@example.com> to=<bg2833@work.com> proto=ESMTP helo=<CORE1UI1>

我正在尝试提取信息并创建一个包含以下内容的表:

DATE                EMAIL                Published Number
Jan 29 12:28:17     bg2833@work.com      561-639-2188

是否可以使用awk或sed来完成此任务?

到目前为止,我能够做到以下几点

head -n 1 file | awk -F ',' 'BEGIN { print "-----------------------\nDate \tEmail\tPhone\n-----------------------"} { print $1;} END { print "-------------"; }'

输出

-----------------------
Date    Email   Phone
-----------------------
Jan 29 12:28:17 torsmtp2 postfix/cleanup[16193]: 5513512078E: warning: header Subject:       American Ramp Systems - Study Updated (Published Number 888-649-2186) from     unknown[10.40.6.11]; from=<Accounts@telmetrics.com> to=<bg2833@att.com> proto=ESMTP helo=    <CORE1UI1>
-------------

仍然不确定如何提取日期/已发布的号码和电子邮件

谢谢

3 个答案:

答案 0 :(得分:2)

使用sed的其他方式

sed -re 's/(.*[0-9]:[0-9]+)(.*)Published Number ([0-9-]+)(.*)to=<(\w+@\w+\.\w+)(.*)>/\1\t\5\t\3/' temp.txt

答案 1 :(得分:1)

因为,这看起来像一个日志文件,我假设格式不会在不同的记录之间改变:

您可以使用以下代码提取日期:
date=$(cat extract.txt | cut -d ' ' -f -3)

您可以使用以下代码段提取到电子邮件(我知道它有点复杂):
email=$(cat extract.txt | sed 's/.*\( to[^ ]*\).*/\1/g' | cut -d '<' -f2 | cut -d '>' -f1)

并且,公布的数字可以提取如下:
number=$(cat extract.txt | sed 's/.*Published Number \([^)]*\).*/\1/g')

我希望这会有所帮助。

<强>更新
使用以下代码段可以轻松提取电子邮件:
email=$(cat extract.txt | sed 's/.* to=<\([^>]*\).*/\1/g')

答案 2 :(得分:1)

awk -v OFS='\t' '{date=$1" "$2" "$3; email=phone=$0; gsub(/.*to=<|>.*$/,"",email);
 gsub(/.*Published Number |).*/,"",phone); print date, email, phone}' file
Jan 29 12:28:17 bg2833@work.com 561-639-2188

在BEGIN部分添加打印标题,如果您想要输出中除标签分隔值以外的其他内容,请使用printf而不是print。