Bash sed从日志文件中删除与另一个文件中的数字相关的行

Bash sed从日志文件中删除与另一个文件中的数字相关的行,bash,Bash,我有一个日志文件,它的大小开始增长,我需要从中删除与给定模式匹配的某些行。我使用grep-nr提取目标行并将它们复制到临时文件中,但我不知道如何告诉sed从日志文件中删除这些行。 我在这里发现了类似的东西:但这实际上并没有删除行,它只打印想要的输出 谁能给我一个提示吗 谢谢大家! 如果您已经有了将想要的内容打印到标准输出的方法,那么就没有理由不直接覆盖原始文件。例如,要仅打印与图案不匹配的行,可以使用: grep -v 'pattern' original > tmp &&

我有一个日志文件,它的大小开始增长,我需要从中删除与给定模式匹配的某些行。我使用grep-nr提取目标行并将它们复制到临时文件中,但我不知道如何告诉sed从日志文件中删除这些行。 我在这里发现了类似的东西:但这实际上并没有删除行,它只打印想要的输出

谁能给我一个提示吗


谢谢大家!

如果您已经有了将想要的内容打印到标准输出的方法,那么就没有理由不直接覆盖原始文件。例如,要仅打印与图案不匹配的行,可以使用:

grep -v 'pattern' original > tmp && mv tmp original
这会将grep命令的输出重定向到临时文件,然后覆盖原始文件。毕竟,任何其他能够做到这一点的解决方案都只是假装这么做

使用sed或awk还有许多其他方法可以做到这一点:


我想,您真正需要的是sed-I'/pattern/d'文件名

但要回答你的问题: 如何从其他文件中删除与行号匹配的行: 假设行号文件中没有特殊字符,每行只有一个数字

awk 'NR==FNR{a[$0]=1; next}; !(FNR in a)' line_numbers input.log
如果您想使用sed,并且您的文件不断增长,那么您必须更频繁地执行sed-i'/REGEX/d'FILENAME

相反,您可以使用syslog ng。只需编辑/etc/syslog ng/syslog-ng.conf,其中需要创建/编辑一个适当的过滤器,类似于:f_example{not matchREGEX;},保存文件,重新启动服务,就完成了

包含该特定模式的消息不会转储到日志文件中。这样,您的文件不仅会停止增长,而且不需要使用sed或grep定期处理它


要删除带有sed的行,可以执行以下操作:

sed "${line}d" <originalLogF >tmpF

顺便说一句,-i选项sed并不神奇,sed将创建一个临时缓冲区,因此,如果我们在日志文件中同时添加了append,您可以减少一些行。

只需将内容保存到另一个文件,然后重命名它即可。awk'{}'infle>outfile我相信sed-i'/pattern/d'文件名是您想要的…如果记录器保持日志文件打开,mv tmp original就不好了。在这种情况下,将继续增长的原始日志文件将被取消匹配。我们必须更改文件的内容,而不是文件cat tmp>original,也不是link,mvI也没有考虑到文件仍然打开或写入的可能性,但是基于cat的方式可以保证防止这种情况吗?cat修改了文件的内容是inode,而不是link name->inode。这就是为什么它的行为在这里是不同的效率较低,但在某些情况下更安全。如果文件仍然打开,而另一个进程同时追加行,那么显然我们可能会丢失数据。所以cat也不是一个很好的解决方案。但是在这种情况下,我不知道一个好的解决方案,而是在应用程序中旋转日志,不让其他人打开文件。我知道这一点,但这并不适合我。我意识到解决方案是低一层。谢谢你的帮助。
sed "${line}d" <originalLogF >tmpF
sed '1d;2d' <originalLogF >tmpF
cat tmpF >originalLogF