如何使用 bash 从大型文本文件中删除行

如何使用 bash 从大型文本文件中删除行

我的 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没有执行,则原始文件将继续增长,而无法通过文件系统层次结构访问。这将导致磁盘上的使用空间如 所示,但 未显示。可以找到更多信息lnseddfdu这里这里

日志轮换是您的好朋友,但如果没有日志程序的帮助,就无法完成。应该有一种方法可以告诉程序关闭并重新打开文件,这样就可以使用新文件,sed但在重新打开文件开始和结束后写入的日志可能会丢失。如果您不想丢失日志,您可以先复制文件,让程序重新打开文件,然后修改复制的文件。这样logrotate您就可以用最少的脚本来完成操作。

您可以阅读有关此主题的更多信息这里(apache 1.3)这里(apache 2.4)这里(绑定 9)

答案3

你可以在 Ex 模式下使用 Vim:

ex -sc '1d2000|x' file
  1. 1移至第一行

  2. 2000选择 2000 行

  3. d删除

  4. x保存并关闭

答案4

设置一个 cron 任务来轮换日志?嗯?

http://linuxcommand.org/man_pages/logrotate8.html

相关内容