SED regex替换日志文件



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

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

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

但是我很难将regex命令正确地转换为SED。我在CentOS6.3盒子上使用sed。

下面是一个在记事本++中工作的命令示例:

^[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

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

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

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

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

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

如果您不介意处理临时文件问题,那么您可能可以使用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,并且不介意使用邪恶的正则表达式。(根据我的经验,dPOSIX类短手操作不可靠,除非您将regexp视为PCRE.

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

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有机会读取之前被截断

最新更新