【问题标题】:Print a part of line if operation of sed and grep is true如果 sed 和 grep 的操作为真,则打印部分行
【发布时间】:2014-01-03 06:51:21
【问题描述】:

试图在 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 而不会影响其符号。 提前致谢。

【问题讨论】:

  • 谢谢...这对我有用... awk -F 'S==' -v k1=this '{gsub("[^A-Za-z0-9]", "", $2); if ($2 ~ k1) 打印 $1}'
  • gsub() 需要一个 RE 作为它的第一个参数,因此您应该使用 RE 分隔符 (/) 而不是字符串分隔符 ("),除非您有充分的理由需要字符串分隔符,例如您正在将显式字符串与变量连接起来。另外,使用[^[:alnum:]],不要硬编码[^A-Za-z0-9]。最后,编写条件+操作的 awk 式方法不是使用 if 语句。所以,这个脚本应该写成'{gsub(/[^[:alnum:]]/, "", $2)} $2 ~ k1{print $1}'

标签: linux sed grep exim


【解决方案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)

我希望这会有所帮助。

【讨论】:

  • 但我需要从主题中删除所有符号。如何删除这些符号 []'"\
  • 这行得通。但仍然无法删除 ^ awk -F 'S==' -v k1=this '{gsub("[^[^A-Za-z0-9]", "", $2); if ($2 ~ k1) 打印 $1}'
  • 乔诺斯 是的。知道了。非常感谢。
【解决方案2】:

之前:您的 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: (只是不要使用像 +.{[$^ 这样的特殊 sed char

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2021-06-19
    • 2017-04-13
    • 1970-01-01
    • 2017-06-30
    • 2021-11-19
    • 2015-02-15
    相关资源
    最近更新 更多