我的 CentOS 中有一个巨大的文本文件(日志文件),我想删除它的顶部,每天大概几千行。(或者可能只是分成两个)
我搜索了这个网站,发现大多数使用 grep、sed 来删除行但输出到另一个文件。不确定是否可以使用 shell 脚本 (bash) 来更新文件?而不是:
sed current file > new file
cp new file > current file
谢谢!
答案1
sed --in-place $filter $file
答案2
没有简单的方法可以删除文件开头的行!
即使使用sed -i
,您也可以创建一个新文件,如下命令所示(>
是我的提示):
> echo "Helo World" > toto
> ls -i toto
147543 toto
> sed -i -e 's/Helo/Hello/' toto
> ls -i toto
147292 toto
注意,inode 编号是不一样的。这意味着您创建了一个同名的新文件,而不是您在原地修改了该文件。
如果您在执行此操作时日志文件被某个程序打开,这一点很重要。如果是这样,您将创建一个新文件,而持有该文件的程序将继续写入旧文件。为了说明这一点,让我们尝试以下操作:
for f in $(seq 1 100); do date; echo $f; sleep 1; done > file1&
ln file1 file2
sleep 5
sed -i -e '1,10d' file1
ls -l file1 file2
sleep 5
ls -l file1 file2
第二个ls
将显示 的大小相同,file1
而 的大小不断增长。如果我在执行 之前file2
没有执行,则原始文件将继续增长,而无法通过文件系统层次结构访问。这将导致磁盘上的使用空间如 所示,但 未显示。可以找到更多信息ln
sed
df
du
这里和这里。
日志轮换是您的好朋友,但如果没有日志程序的帮助,就无法完成。应该有一种方法可以告诉程序关闭并重新打开文件,这样就可以使用新文件,sed
但在重新打开文件开始和结束后写入的日志可能会丢失。如果您不想丢失日志,您可以先复制文件,让程序重新打开文件,然后修改复制的文件。这样logrotate
您就可以用最少的脚本来完成操作。
您可以阅读有关此主题的更多信息这里(apache 1.3),这里(apache 2.4)和这里(绑定 9)。
答案3
你可以在 Ex 模式下使用 Vim:
ex -sc '1d2000|x' file
1
移至第一行2000
选择 2000 行d
删除x
保存并关闭
答案4
设置一个 cron 任务来轮换日志?嗯?