我尝试在 7 天后匿名化我的 Apache 日志,但实际上我在编写匿名化脚本时已经遇到了一些麻烦。
我的脚本用 替换了前 3 位数字,X
并且在与 bash 脚本位于同一目录中的日志文件中运行时它可以正常工作。
但我想使用通配符来匿名化来自我的子域的所有日志,如下所示:
./anonym /basedir/*/logs/access.log
但这不能正常工作。
这是我的脚本:
#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line" | sed s/./X/1 | sed s/./X/2 |sed s/./X/3
done < "$1">"/tmp/$1"
mv "/tmp/$1" "$1"
谢谢你的帮助。
答案1
要对多个文件执行相同的操作,您需要将代码包装在循环中,例如:
#!/bin/bash
tmpfile=/tmp/anon.$$
for path; do
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "$line" | sed -e s/./X/1 -e s/./X/2 -e s/./X/3
done < "$path" > "$tmpfile"
mv "$tmpfile" "$path"
done
答案2
由于你最终会写入同一个文件,所以只需使用sed -i
(尽管它不是 POSIX)。从man 1 sed
:
-i[SUFFIX]
,--in-place[=SUFFIX]
就地编辑文件(如果提供了扩展,则进行备份)。默认操作模式是断开符号和硬链接。可以使用--follow-symlinks
和进行更改--copy
。
此外,以下 sed 表达式可以替换您的三个单独的表达式:s/.../XXX/
。一般来说,它并不完全等同,也许您想改进它。无论如何,-i
您需要做的就是:
sed -i `s/.../XXX/` /basedir/*/logs/access.log