用于屏蔽日志文件中敏感数据的Unix脚本?

时间:2012-07-05 11:44:47

标签: perl unix sed awk

我必须编写一个脚本来掩盖日志文件中的敏感数据。我很困惑如何实现这个?哪个选项最适合做同样的事情:

  • 使用AWK
  • 使用SED
  • 使用SED,AWK
  • 使用PERL
  • 使用简单的文件读取和搜索逻辑。

如果您有任何建议,请分享。

Input File:
Name  Jack
Add   New York
Phone 333-333-3434

Output File:
Name   Jack
Add    New York
Phone  XXX-XXX-XXXX

我用awk尝试了这个:

cat $HOME_DIR/testdata.dat | awk 'BEGIN{ 
    i=1; 
    FS=" "; 
} 
{ 
    for (i = 1; i < NF; i++) { 
        fld = $(i); 
        if( fld == "PHONE") { 
            printf ("%s$%s", $(i),$(i+1)); 
        } 
        else if( fld == "PIN") { 
            printf ("%s$%s", $(i),$(i+1)); 
        } 
        else if( fld == "DOB") { 
            printf ("%s$%s", $(i),$(i+1)); 
        } else { 
            printf ("%s", $(i)); 
        } 
    } 
    printf ("\n"); 
} 
END{ 
    i=1 
}' > $HOME_DIR/testdataupd.dat

3 个答案:

答案 0 :(得分:2)

使用awk的一种方法。如果在行的开头找到单词phonedobpin(忽略大小写),则在第二个字段中替换除- X之外的所有字符。每行执行print命令。

awk '
    BEGIN { 
        IGNORECASE = 1
    }
    $1 ~ /^(phone|dob|pin)$/ {
        gsub( /[^-]/, "X", $2 )
    }
    { print }
' $HOME_DIR/testdata.dat >$HOME_DIR/testdataupd.dat

答案 1 :(得分:0)

这是一个90%的答案,但不会按照你的要求格式化X.

sed -re 's/(Phone )(([0-9]+)-?)*/\1xxxxx/g'

了解更多字段

sed -r -e 's/(Phone )(([0-9]+)-?)*/\1xxxxx/g' -e 's/regexp-to-search-for/replacement-pattern/g' …

注意:你可以替换/和你喜欢的角色,只要它相同,所有3次,例如s~regexp~rep~g

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed '/^Phone\|^DOB\|^Pin/!b;h;s/\S*\s*//;s/[^-]/X/g;H;x;s/\(\S*\)\n\(\S*\)/\2/' file

说明:

  • /^Phone\|^DOB\|^Pin/!b仅处理以PhoneDOBPin开头的行(在此处添加更多内容)
  • h复制模式空间(PS)以保存空间(HS),即复制当前行。
  • s/\S*\s*//删除第一个第一个字段,然后删除空格。
  • s/[^-]/X/g将所有-的{​​{1}}替换为剩余字段中的X
  • H附加换行符,然后将PS附加到HS。
  • x与PS交换HS
  • s/\(\S*\)\n\(\S*\)/\2/用修改后的第二个字段替换原来的第二个字段。