试图在 exim 主日志中找到垃圾邮件发送者。 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 而不影响其符号。
提前致谢。
最佳答案
如果可能的话,这对 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)
希望对您有所帮助。
关于linux - 如果 sed 和 grep 操作为真,则打印部分行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20898219/