linux如何删除备份文件夹,linux – 如何使用sed命令删除没有备份文件的行?

我有大文件,大小为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的文件时,它将通过sed进程传输该文件,将输出写入新文件(临时文件),当一切完成后,它将新文件重命名为原始名称.

(还有创建备份文件的选项,但是你没有给它们,所以我不会再提这些了.)

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

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

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

seq 0 999999 > x

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

grep -v 4 1<>x

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

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

您将不知道输出的时间长度,因此在输出后将显示该文件的原始内容:

999991

999992

999993

999995

999996

999997

999998

999999

537824

537825

537826

537827

537828

537829

您可以使用Unix工具截断来手动缩短文件.在实际情况中,您将难以找到适当的位置,因此计算写入的字节数(使用wc)是有意义的:

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

(grep -v 4 x) |& wc -c

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

truncate -s 3653658 x

现在你有了想要的结果.

如果你想在脚本中这样做,我.即没有互动,你可以使用这个:

length=$((grep -v 4 x) |& wc -c)

truncate -s "$length" x

我无法保证这适用于您机器上的> 2GB或> 4GB文件;取决于您的操作系统(32位?)和已安装工具的版本,您可能会遇到大文件问题.我首先使用大文件执行测试(> 4GB,因为这通常是许多事情的限制),然后交叉你的手指试一试:)

您必须记住一些警告:

>当然,在程序运行时,没有人应该将日志条目附加到该日志文件.

>此外,在运行过程中的任何中止(电源故障,信号捕获等)都会使文件处于未定义状态.但是在发生这种事故之后再次重新运行命令将在大多数情况下产生正确的输出;某些行可能会加倍,但不会超过单行应该被破坏.

>当然,输出必须小于输入,否则写入将超过读数,破坏整个结果,以便应该存在的行将丢失(或在开始时截断).

标签:file,linux,vim,sed,redhat

来源: https://codeday.me/bug/20190608/1200631.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值