0

试图在 exim mainlog 中查找垃圾邮件发送者。Mainlog 有邮件 ID 和主题,如下所示。

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(@ 和 .)中的符号也被删除了。所以我的问题是如何应用sed并且grep仅适用于主题S==thi#s i ^s an*ot+her Su~bj)ec%t,如果满足打印邮件 ID 而不会影响其符号。提前致谢。

4

2 回答 2

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
  • 如果第二个字段与关键字 in 匹配k1,则打印第一个字段(= 邮件 ID)

我希望这有帮助。

于 2014-01-03T07:03:45.073 回答
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)and (at)。几乎可以使用任何其他模式,如#at#or§1§:a:代替(只是不要使用特殊的 sed char+.{[$^

于 2014-01-03T07:22:29.223 回答