【问题标题】:How to use sed command to delete lines without backup file?如何使用 sed 命令删除没有备份文件的行?
【发布时间】:2016-08-13 01:19:59
【问题描述】:

我有一个大小为 130GB 的大文件。

# ls -lrth
-rw-------. 1 root root 129G Apr 20 04:25 syslog.log

所以我需要通过删除以 "Nov 2" 开头的行来减小文件大小,所以我给出了以下命令,

sed -i '/Nov  2/d' syslog.log

所以我也不能使用 VIM 编辑器编辑文件。

当我触发 SED 命令时,它也会创建备份文件。但是我在根目录中没有太多空间。请尝试提供替代解决方案,以便在不增加服务器空间的情况下从此文件中删除特定行。

【问题讨论】:

  • 为什么还要创建备份文件?它叫什么名字?如果你说sed -i '' 会怎样?你确定是使用 Red Hat 还是使用 OSX?

标签: linux file vim sed redhat


【解决方案1】:

它不会创建真正的备份文件。 sed 是一个 编辑器。当应用到带有选项-i 的文件时,它将通过sed 进程 该文件,将输出写入一个 文件(临时文件),当一切都完成了,它会将新文件重命名为原始名称。

(也有创建备份文件的选项,但你没有提供,所以我不再提及。)

在您的情况下,您有一个非常大的文件并且不想创建任何副本,无论多么临时。为此,您需要同时打开文件进行读取写入,然后您的sed 进程可以覆盖原始文件。在此之后,您将不得不在写作结束时截断文件。

为了演示如何做到这一点,我们首先执行一个测试用例。

创建一个包含很多行的测试文件:

seq 0 999999 > x

现在,假设我们要删除所有包含数字 4 的行:

grep -v 4 1<>x <x

这将打开文件以作为 STDOUT (1) 读取和写入,并以 STDIN 读取。 grep 命令将读取所有行并仅输出包含4(选项-v)的行

这将有效地覆盖原始文件的开头。

你不会知道输出多长时间,所以输出后会出现文件的原始内容:

…
999991
999992
999993
999995
999996
999997
999998
999999
537824
537825
537826
537827
537828
537829
…

之后您可以使用 Unix 工具 truncate 手动缩短文件。在实际场景中,您将很难找到正确的位置,因此计算写入的字节数是有意义的(使用wc):

(不要忘记为此测试重新创建原始x。)

(grep -v 4 <x | tee /dev/stderr 1<>x) |& wc -c

这将执行上述步骤并额外打印出写入终端的字节数,在本例中,输出将为3653658。现在使用truncate:

truncate -s 3653658 x

现在你得到了你想要的结果。

如果您想在脚本中执行此操作,i. e.无需交互,您可以使用:

length=$((grep -v 4 <x | tee /dev/stderr 1<>x) |& wc -c)
truncate -s "$length" x

我不能保证这适用于您机器上 >2GB 或 >4GB 的文件;根据您的操作系统(32 位?)和安装工具的版本,您可能会遇到大文件问题。我会先对大文件进行测试(> 4GB,因为这通常是很多事情的限制),然后交叉手指尝试一下:)

一些注意事项您必须牢记:

  • 当然,没有人应该将日志条目附加到该日志文件过程正在运行。
  • 此外,进程运行期间的任何中止(电源故障、信号捕获等)都会使文件处于未定义状态。但在发生此类事故后再次重新运行命令将在大多数情况下产生正确的输出;有些行可能会加倍,但损坏的行不能超过一行。
  • 当然,输出必须小于输入,否则写入会超过读取,从而破坏整个结果,以至于应该存在的行将丢失(或在开始时被截断) )。

【讨论】:

  • 同意,我想不出任何 shell 手段来实现不复制的技巧。我在考虑 anything 时遇到了麻烦,因为它可以避免给定 Unix 文件系统语义的部分副本。
  • @msw : 谢谢你的建议,我会尽量让存储团队提供空间。
  • ++;关于两个切线注释:seq 1000000 &gt; x 是创建测试文件的更快替代方案。将truncate 称为“shell 实用程序”有点令人困惑(它是一个与 shell 本身无关的 CLI)。
  • @mklement0 感谢您的建议,我在答案中采用了您的 cmets(我认为“Unix 工具”这个词比“shell 实用程序”更合适)。
  • @Alfe: 太好了....感谢您的及时帮助.....
猜你喜欢
  • 2014-10-18
  • 2015-08-07
  • 2017-10-13
  • 1970-01-01
  • 2012-05-11
  • 2018-07-17
  • 2020-10-20
  • 2014-02-11
  • 1970-01-01
相关资源
最近更新 更多