linux – 编辑巨大的sql数据文件

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

我怎样才能做到这一点.我试图使用head,tail sed但它似乎创建了一个临时文件.没有临时文件可以做到吗?

解决方法

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

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

我使用过的所有十六进制编辑器都使用双面板视图,左侧面板以十六进制显示文件的字节,右侧面板尝试在可能的情况下显示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 in less enable行编号)

现在,知道第23行的内容:

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

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

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

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

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

>使用gHex中的菜单
>在hexedit中使用Ctrlx并在询问是否保存更改时回答(Y)es.

始终确保备份到位!

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

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...