我尝试在VIM中打开一个巨大的文件(大约2GB),但它卡住了。实际上,我并不需要编辑这个文件,只需要高效地跳转到其中的内容。
如何处理在VIM中处理非常大的文件?
我尝试在VIM中打开一个巨大的文件(大约2GB),但它卡住了。实际上,我并不需要编辑这个文件,只需要高效地跳转到其中的内容。
如何处理在VIM中处理非常大的文件?
grep -n 'something' HUGEFILE | head -n 1
提取文件的范围。假设您想编辑的行在第4行和第5行。那么请执行以下操作:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
选项用于禁止sed的默认行为,即打印所有内容。4,5p
打印第4和第5行。5q
处理完第5行后终止sed。使用您喜欢的编辑器编辑SMALLPART
。
合并文件:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
现在是您编辑后的文件,您可以删除原始的HUGEFILE
文件。
more
或less
——less
甚至提供了类似于vi
的按键进行滚动和搜索。vim
的界面(包括一个ex
模式?)。split
和cat
等工具绕过这个问题;但我考虑的是编辑器,特别是可以不需要这样做并节省我们时间/延迟以及磁盘空间开销的控制台/ curses编辑器)。我根据Florian的回答编写了一个小脚本,它使用nano(我最喜欢的编辑器):
#!/bin/sh
if [ "$#" -ne 3 ]; then
echo "Usage: $0 hugeFilePath startLine endLine" >&2
exit 1
fi
sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2
使用方法如下:
sh hfnano yourHugeFile 3 8
举个例子,nano将打开第3到8行,您可以编辑它们,当您保存并退出时,这些行在hugefile中将自动被您的保存行覆盖。
我曾遇到同样的问题,但是它是一个300GB的mysql转储文件,我想要去掉DROP
并将 CREATE TABLE
更改为 CREATE TABLE IF NOT EXISTS
,因此不想运行两个sed
调用。我编写了这个快速的Ruby脚本来复制带有这些更改的文件:
#!/usr/bin/env ruby
matchers={
%q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
%q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}
matchers.each_pair { |m,r|
STDERR.puts "%s: %s" % [ m, r ]
}
STDIN.each { |line|
#STDERR.puts "line=#{line}"
line.chomp!
unless matchers.length == 0
matchers.each_pair { |m,r|
re=/#{m}/
next if line[re].nil?
line.sub!(re,r)
STDERR.puts "Matched: #{m} -> #{r}"
matchers.delete(m)
break
}
end
puts line
}
被调用方式如下
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
,您也可以直接执行ruby mreplace.rb ..
。 - Smar对于巨大的一行代码(从1
打印字符到99
):
cut -c 1-99 filename
虽然已经很晚了,但如果你只是想在不编辑文件的情况下浏览它,cat
也可以完成任务。
% cat filename | less
或者简单地说:
% less filename
cat
命令是非常愚蠢的操作,因为它要么在内存中完全加载文件 (以便 less
可以查找文件),要么根本不能查找;cat
命令只提供静态输出流。 - SmarEmacs在处理数百兆字节的文件时表现非常出色,我曾经用它来处理日志文件而没有遇到太多麻烦。
但通常情况下,当我需要进行某种分析任务时,我发现编写Perl脚本是更好的选择。
旧帖子。但尽管如此(双关语 :) )。
$less filename
如果您只是浏览文件而不需要编辑的话,less 在检查大型日志文件时会非常高效。
在 less 中搜索的方式类似于 vi。
最好的部分是,在大多数发行版中它默认可用。因此,即使在生产环境中也不会有问题。
这个很老了,但是可以使用nano、vim或gvim。
:set binary
命令,使用Vim应该就没有问题了。 - ephemient