我运行一个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
它会清空整个文件。我看了一遍,我怀疑我有空白问题,但经过大约一个小时的搜索,我被卡住了。感谢任何帮助,我可以提供更多示例。
答案 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
有机会阅读之前被截断