我试图在VIM中打开一个巨大的文件(〜2GB),但它被阻塞了。我实际上不需要编辑文件,只需高效地跳转即可。
如何在VIM中处理非常大的文件?
:set binary
第一次...
我试图在VIM中打开一个巨大的文件(〜2GB),但它被阻塞了。我实际上不需要编辑文件,只需高效地跳转即可。
如何在VIM中处理非常大的文件?
:set binary
第一次...
Answers:
我今天有12GB的文件要编辑。vim LargeFile插件对我不起作用。它仍然用完了我所有的内存,然后显示一条错误消息:-(。我也不能使用hexedit,因为它不能插入任何东西,只能覆盖。这是另一种方法:
您分割文件,编辑零件,然后重新组合。但是,您仍然需要两倍的磁盘空间。
Grep查找您要编辑的行周围的内容:
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
诸如滚动和搜索键绑定之类的方法。
一个Freshmeat站点上的“大文件”的搜索表明,两位编辑将特别适合您的需求。
一个可能是:lfhex ...一个大文件的十六进制编辑器(取决于Qt)。显然,该程序需要使用GUI。
另一个似乎适合控制台使用:hed ...,它声称具有类似vim
接口(包括ex
模式?)。
我确定我已经见过其他Linux / UNIX编辑器,它们能够在不将文件整体加载到内存的情况下进行页面分页。但是,我不记得他们的名字了。我将此回复设为“ wiki”条目,以鼓励其他人将其链接添加到此类编辑器。(是的,我熟悉使用split
和来解决该问题的方法,cat
但是我正在考虑使用编辑器,尤其是控制台/ curses编辑器,因为它们可以省去该设置,并为我们节省了这种方法所需的时间/延迟和磁盘空间开销) 。
我根据弗洛里安的回答写了一个小脚本,该脚本使用了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行,您可以对其进行编辑,并且在保存并退出时,巨大文件中的这些行将自动被保存的行覆盖。
我遇到了同样的问题,但是那是一个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 ..
旧线程。但是尽管如此(pun :))。
$less filename
如果您不想编辑,只需查看一下即可检查大型日志文件,那么less可以有效地工作。
搜索较少的作品,如vi
最好的是,大多数发行版默认提供该功能。因此,对于生产环境也不会出现问题。