3

我运行我的世界服务器并喜欢定期清理我的日志文件。我开发了一堆可以在 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

它清空整个文件。我已经看了一遍,我怀疑我遇到了空格问题,但是经过大约一个小时的搜索后,我被卡住了。任何帮助表示赞赏,我可以提供更多示例。

4

2 回答 2

2

如果要在线修改文件而不创建临时文件,可以使用 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 类速记不能可靠地工作,除非您将正则表达式视为 PCRE。

于 2012-10-11T23:05:00.147 回答
1

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

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

于 2012-10-11T22:52:35.593 回答