2013-01-10 100 views
1

出于安全原因,我需要隐藏日志文件中的IP地址。 IP地址是版本4和6如何隐藏,

IPv4的例子123.4.32.16x.x.x.x更换

IPv6的例子232e:23o5:te43:5423:5433:0000:ef09:23ffx:x:x:x:x:x:x:x替代的方式中的地址?

是否可以使用单个sed命令执行此操作?用sed替换目录中的多个文件的文本

+0

是否所有的IPv6地址都是扩展形式?如果不是,这将是一个挑战......(你想使用'sed','grep'只做正则匹配) – fge

+0

啊,我明白了。是的,IPv6地址是扩展形式。这里的文章说,我们可以使用grep来处理这种情况:http:// vasir。net/blog/ubuntu/replace_string_in_multiple_files/ –

+0

然而,你会看到'grep'被传送到'sed'; – fge

回答

2

您可能想要使用找到sed为此。

让我们假设你的日志的扩展名为 “.LOG”:

find /path/to/logs -type f -name '*.log' -exec  \ 
sed -i -e 's,[0-9]\+\(\.[0-9]\+\)\{3\},x.x.x.x,g' \ 
-e 's,[0-9a-f]\+\(:[0-9a-f]\+\)\{7\},x:x:x:x:x:x:x:x,gi' {} \; 

这是如何工作的?

  1. 首先,我们要求找到递归定位与.LOG扩展从/路径开始的文件/到/日志-type f告诉我们我们不想找到常规文件。

  2. 对于每个文件,它将执行sed-i参数告诉sed你想编辑文件。 (查看http://www.grymoire.com/Unix/Sed.html)解决方案使用findperl

+0

你的'find'命令也可以找到目录;) – fge

+0

好,有效的点。加上“-type f”=) – brain

+0

@brain:你说“-type f告诉我们找不到常规文件”,你的意思是常规的文本文件吗? –

0

一:

find /the/directory -type f -exec perl -pi -e ' 
    s/\b\d{1,3}(\.\d{1,3}){3}\b/x.x.x.x/g; 
    s/\b[a-f\d]{1,4}(:[a-f\d]{1,4}){7}\b/x:x:x:x:x:x:x:x/gi' {} \; 

(在一行中键入)

0

嗯,首先你应该只是解决什么是做日志记录记录你想要的方式。

现在,如果你需要回去和修改的历史文件,您可以考虑使用sed

sed -e 's/\b(\d{1,3}\.){3}\d{1,3}\b/x.x.x.x/' /path/to/file 
sed -e 's/\b([:xdigit:]{4}:){7}[:xdigit:]{4}\b/x.x.x.x.x.x.x.x/' /path/to_file 
+0

'{0,3}'?你确定? ;) – fge

+0

糟糕..更正了 –

+0

此外,IPv6是十六进制(而'sed'有'/ i')。 – fge

0

我用这个:

find . -name "*.log" -exec grep -izl PATTERN {} \; | xargs perl -i.orig -e -n 's/PATTERN/REPLACEMENT/g'

你想要插入你的模式( s),并根据您的日志文件的名称将* .log替换为其他内容。

-i.orig备份替换为.orig扩展名的文件。

我发现这比我尝试的其他东西相对更快。找到/ grep组合来识别候选人,然后perl来完成这项工作。