Vat*_*nth 4 linux vim redhat sed file
我有大文件,大小为130GB.
# ls -lrth
-rw-------. 1 root root 129G Apr 20 04:25 syslog.log
Run Code Online (Sandbox Code Playgroud)
所以我需要通过删除以"Nov 2"开头的行来减小文件大小,所以我给出了以下命令,
sed -i '/Nov 2/d' syslog.log
Run Code Online (Sandbox Code Playgroud)
所以我也无法使用VIM编辑器编辑文件.
当我触发SED命令时,它也会创建备份文件.但我根本没有太多空间.请尝试提供备用解决方案以从此文件中删除特定行,而不增加服务器中的空间.
它不会创建真正的备份文件. sed
是一个流编辑器.当应用于带有选项的文件时,-i
它将通过该进程流式传输该文件sed
,将输出写入新文件(临时文件),一切完成后,它将新文件重命名为原始名称.
(还有创建备份文件的选项,但是你没有给它们,所以我不会再提这些了.)
在您的情况下,您有一个非常大的文件,不想创建任何副本,但不是临时的.为此,您需要打开文件进行读取,并在同一时间写,那么你的sed
进程可以覆盖原来的.在此之后,您将不得不在写作结束时截断文件.
为了演示如何做到这一点,我们首先执行测试用例.
创建一个包含许多行的测试文件:
seq 0 999999 > x
Run Code Online (Sandbox Code Playgroud)
现在,假设我们要删除包含该数字的所有行4
:
grep -v 4 1<>x <x
Run Code Online (Sandbox Code Playgroud)
这将打开文件以读取和写入STDOUT(1),并作为STDIN读取.该grep
命令将读取所有行,并仅输出不包含4
(选项-v
)的行.
这将有效地覆盖原始文件的开头.
您将不知道输出的时间长度,因此在输出后将显示该文件的原始内容:
…
999991
999992
999993
999995
999996
999997
999998
999999
537824
537825
537826
537827
537828
537829
…
Run Code Online (Sandbox Code Playgroud)
之后您可以使用Unix工具truncate
手动缩短文件.在实际情况中,您将难以找到适当的位置,因此计算写入的字节数(使用wc
)是有意义的:
(不要忘记x
为此测试重新创建原始文件.)
(grep -v 4 <x | tee /dev/stderr 1<>x) |& wc -c
Run Code Online (Sandbox Code Playgroud)
这将执行上述步骤并另外打印写入终端的字节数,在此示例中输出将是3653658
.现在使用truncate
:
truncate -s 3653658 x
Run Code Online (Sandbox Code Playgroud)
现在你有了想要的结果.
如果你想在脚本中这样做,即没有交互,你可以使用:
length=$((grep -v 4 <x | tee /dev/stderr 1<>x) |& wc -c)
truncate -s "$length" x
Run Code Online (Sandbox Code Playgroud)
我无法保证这适用于您机器上> 2GB或> 4GB的文件; 取决于您的操作系统(32位?)和已安装工具的版本,您可能会遇到大文件问题.我首先使用大文件执行测试(> 4GB,因为这通常是许多事情的限制)然后交叉你的手指试一试:)
您必须记住一些警告: