用sed替换目录中多个文件的文本

时间:2013-01-10 00:47:24

标签: regex unix sed

出于安全原因,我需要隐藏日志文件中的IP地址。 IP地址为版本4和6.如何以下列方式隐藏地址:
由IPv4 123.4.32.16替换为x.x.x.x和< br /> IPv6示例232e:23o5:te43:5423:5433:0000:ef09:23ffx:x:x:x:x:x:x:x取代?

是否可以使用单个sed命令执行此操作?

4 个答案:

答案 0 :(得分: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 扩展名从 / path / to / logs 开始的文件。 -type f 告诉我们找不到常规文件。

  2. 对于每个文件,它将执行 sed -i 参数告诉sed您要编辑该文件。 (查看http://www.grymoire.com/Unix/Sed.html

答案 1 :(得分:0)

使用findperl的一个解决方案:

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' {} \;

(在一行输入)

答案 2 :(得分: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

答案 3 :(得分:0)

我用这个:

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

您希望插入PATTERN并将* .log替换为其他内容,具体取决于日志文件的名称。

-i.orig使用扩展名.orig备份要替换的文件。

我发现这比我尝试的其他东西要快。 find / grep combo来识别候选者,然后perl来完成工作。