SED正则表达式替换日志文件

时间:2012-10-11 22:49:36

标签: regex sed

我运行一个Minecraft服务器,喜欢定期清理我的日志文件。我已经开发了一堆我可以在gedit或notepad ++中使用的正则表达式命令,它们工作得很好,但我希望能够自动化这个过程。

基本文件清理命令如下所示:

cat server.log | sed -e 's/REGEXTODELETE//g' > server.log

但我无法将正则表达式命令正确转换为SED。我在CentOS6.3盒子上使用sed。

以下是在notepad ++中使用的命令示例:

^[0-9]+-[0-9]+-[0-9]+ [0-9]+:[0-9]+:[0-9]+ \[INFO\] Connection reset$

但是当我把它输入我的bash脚本时:

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\] Connection reset$//g' > server.clean.log

它会清空整个文件。我看了一遍,我怀疑我有空白问题,但经过大约一个小时的搜索,我被卡住了。感谢任何帮助,我可以提供更多示例。

2 个答案:

答案 0 :(得分:1)

如果要在不修改临时文件的情况下在线修改文件,可以使用sed的-i选项。例如,如果要删除任何包含您提到的字符串的行,可以使用:

sed -i'' '/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$/d' server.log

这可以避免不必要的管道,以及将输出重定向到输入文件时遇到的混乱。

请注意,我在这里使用sed删除LINES。当您使用s/RE/text/表示法时,您将在线替换内容。您的输出行总数将与输入相同,只有(我收集)如果您只是将文本替换为空白,则会有一堆空白行。

如果您不介意处理临时文件问题,则可以使用grep代替sed,以使其更加清晰。

grep -v '^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$' server.log > clean..log

或者甚至可能:

grep -Pv '^\d+(-\d+)+ \d+(:\d+)+ \[INFO\]  Connection reset$' server.log > clean.log

如果你使用Linux而不介意evil regular expressions。 (根据我的经验,除非您将正则表达式视为PCRE,否则\d POSIX类的简写不起作用。

答案 1 :(得分:0)

问题是您在读取输入文件之前是否覆盖它。

cat server.clean.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$//g' > server.clean.log

应该像

cat server.log | sed -e 's/^[0-9]*-[0-9]*-[0-9]* [0-9]*:[0-9]*:[0-9]* \[INFO\]  Connection reset$//g' > server.clean.log

一般来说,

program <infile >infile

将无效(可靠),因为infile会在program有机会阅读之前被截断