编辑巨大的sql数据文件

时间:2015-06-09 08:48:53

标签: linux sed

我有一个23GB的文件,我想编辑第23行,但我在服务器上只有200 MB RAM。我不想完全打开文件,因为我只留下了20GB的可用磁盘空间。

我该怎么做?我试图使用head,tail sed但它似乎创建了一个临时文件。没有临时文件可以做到吗?

2 个答案:

答案 0 :(得分:1)

解决方案是使用十六进制编辑器编辑文件。 Hex编辑器用于处理大型文件,甚至是整个磁盘和分区。

您可能会发现hexedit(基于ncurses)或ghex(基于Gnome / Gtk)非常有用。它们是常用的工具,因此您很可能会在您的发行版中找到它们。

我使用的所有十六进制编辑器,使用双面板视图,左侧面板以十六进制显示文件的字节,右侧面板尝试在可能的情况下显示Ascii表示。

为了查找和编辑您的第23行:

sed -n '23p' my_huge_dump.sql:将打印此行的内容
sed -n '23p' my_huge_dump.sql | od -A n -t x1:将以十六进制格式打印此行的内容。

或使用less -N my_huge_dump.sql打开文件并查看第23行的内容。-N中的less启用行号编号

现在,了解第23行的内容:

  • 如果此行的文本有点独特且与周围的行不同,您可以从右侧(ascii)面板找到它并使用箭头导航到此行。在hexedit中,您可以使用 Tab 键在Hex和Ascii面板之间移动。在gHex中,您也可以使用鼠标。您也可以搜索您感兴趣的字符串:移至Ascii面板并按hexedit中的 / 或使用gHex中的菜单。
  • 如果您要修改的行与其他行有相似的内容而您无法在ascii面板中找到它,那么您必须计算"换行符"分隔符找到第23行。新行(LF)以十六进制表示为0A。在ASCII面板中,新行表示为点.

然后假设您找到了要编辑的行,您有以下选项:

  • 希望第23行的新内容的长度与现有内容相同或更短(因此您不需要增长和移动整个文件)。在这种情况下,您必须输入Fill-mode,即您覆盖旧文本的现有内容的模式。这是gHexhexedit中的默认模式。移动到要编辑的位置并开始输入。按 Backspace 将撤消您的更改。如果新内容比现有内容短,则可以用空格填充该行以避免截断文件。
  • 如果新内容比此行中的现有内容长,则必须进入Insert模式。您可以使用gHex中的菜单执行此操作。在hexedit中,您必须使用 Esc I 键绑定。然后开始输入,新字符将附加在当前位置。

在第一种情况下,保证文件的编辑和保存将是即时的,因为将进行就地编辑。在后一种情况下,我不确定如何处理大小的增长和后续字节的移动,但我希望文件系统使用更大的非连续块来移动一些内容而不是移动整个文件。

如果您对更改感到满意,请保存文件:

  • 使用gHex
  • 中的菜单
  • hexedit中使用 Ctrl x ,并在询问是否保存更改时回答(Y)es

始终确保备份到位!

编辑:我发现gHex并不适合您的情况,因为它试图将整个文件加载到内存中。 hexedit会很好。但是,如果您需要gHex之类的图形编辑器,但具有部分文件加载功能,则可以尝试wxHexEditor。另请查看维基百科中的Comparison of Hex editors页面。

答案 1 :(得分:0)

Liquid Studio Community Edition包含一个Large File Editor,它可以在低规格机器上打开和编辑Terra-byte文件,并且是免费的。

它需要足够的磁盘空间来复制文件(将其写回时),但几乎不需要任何内存。

Liquid Studio Large File Editor