如果sed和grep的操作为真,则打印一部分行

时间:2014-01-03 06:51:21

标签: linux sed grep exim

尝试在exim主日志中找到垃圾邮件发送者。 Mainlog有邮件ID和Subjects,如下所示。

username1@example.com S==thi#s i $s @a Su~bJec%t
username2@example2.com S==thi#s i ^s an*ot+her Su~bj)ec%t

我要做的是采取主题,删除所有符号,空格使用sed和grep关键字。如果满意,则打印邮件ID。 我成功删除了所有符号,空格和grep关键字,但问题是来自邮件ID(@和。)的符号也被删除。 所以我的问题是如何仅将sedgrep应用于主题S==thi#s i ^s an*ot+her Su~bj)ec%t,以及如果满足打印邮件ID而不影响其符号。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

sed如果可能的话,这会很棘手。如果您对awk感到满意:

awk -F' S==' -v k1=this '{gsub("[][()#$@~% ]", "", $2); if ($2 ~ k1) print $1}'

如果你想删除所有非字母数字字符,那么最好像这样写:

awk -F' S==' -v k1=this '{gsub("[^[:alnum:]]", "", $2); if ($2 ~ k1) print $1}'

如果您的awk版本不支持[:alnum:],那么您可以这样写:

awk -F' S==' -v k1=this '{gsub("[^a-zA-Z0-9]", "", $2); if ($2 ~ k1) print $1}'

说明:

  • 使用S==作为字段分隔符来分割邮件ID和主题部分
  • k1变量中传入关键字“this”。您可以使用具有相同格式的更多-v参数的任何其他关键字或多个关键字,例如-v k2=something
  • 使用gsub
  • 删除第二个字段中的所有符号
  • 如果第二个字段与k1中的关键字匹配,则打印第一个字段(=邮件ID)

我希望这会有所帮助。

答案 1 :(得分:0)

之前:你的grep / sed(可能在你的sed治疗中,但在你的行动之前)

sed 's/@/(at)/1
: dot
   s/^\([^ ]*\)\.\([^ ]*\) /\1(dot)\2 /
   t dot'
在你的grep sed之后(可能是你的sed治疗,但是你的行动已经完成)

sed 's/(dot)/./g;s/(at)/@/g'

假设您的主题中没有(dot)(at)。几乎可以使用任何其他模式,例如#at#§1§:a:(只是不使用像+.{[$^这样的specal sed char