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

标签 linux sed grep exim

试图在 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 中的符号(@ 和 .)也被删除了。 所以我的问题是如何将 sedgrep 仅应用于主题 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/

相关文章:

c++ - 在 C++ 中读/写二进制文件

linux - 用找到的模式替换当前字符串

linux - 确定哪些关键字可以在哪些文件中找到

python - 按包含数字的行排序,忽略附加在字母上的数字

linux - GNU 使自动依赖生成

linux - 解析日志并打印 csv 文件中的某些字段

linux - 当从 ls | 传送结果时 head 不起作用grep

java - 如何在 ant 文件中对 ipv6 地址执行 scp

linux - 如何使用过时的选项编译Linux内核?

linux - Unix shell 目录历史