使用 awk 屏蔽电子邮件地址、电话号码、ssn(模式)

Mask email address, phonenumber, ssn (pattern) using awk

要求是从日志文件中屏蔽一些敏感数据,当 awk 版本为 4.0.2 时,下面的代码按预期工作。

我将 grep 处理日志文件,然后必须使用下面 awk 片段中提到的模式屏蔽一些数据,然后 return 结果。

echo "123-123-432-123-999-889 and 123456 and 1234-1234-4321-1234 and xyz@abc.com" | awk ' gsub (/[0-9]{6,}|([0-9]{3,}.){3,}|\w{2,}@\w{2,}.\w{2,}/, "****") 1'

这在 awk 版本 3.1.7 中不起作用,这是生产服务器版本。

我只能使用 grep, cat, awk无权使用 perlsed,因为它受到管理团队的限制。

预期输出:

****and **** and ****and ****

如果内容在文件中,解决方案也应该有效,例如

sample.log

123-123-432-123-999-889
and 
123456
and
1234-1234-4321-1234 
and xyz@abc.com

命令:

 cat sample.log  | awk ' gsub (/[0-9]{6,}|([0-9]{3,}.){3,}|\w{2,}@\w{2,}.\w{2,}/, "****") 1'

请帮助我使用 awk,它可以在 3.1.7 版本的 awk

中工作

激活 RE 间隔:

awk --re-interval '...'

您可能还需要将 \ws 替换为 [[:alnum:]_]

您遇到的问题是,您使用的是默认启用 RE 间隔(例如 {1,3})之前的非常旧版本的 gawk,因此在那个旧 gawk 中,每个 { } 只是一个文字字符,用于向后兼容 1980 年代的 awks(旧的、损坏的 awk 和 nawk),因此您需要明确告诉 gawk 将 {1,3} 解释为 RE 间隔而不是文字字符串5 个字符。

不知道当时是否支持 \w,所以您可能还需要使用我上面建议的括号表达式。