我有超过1 TB的MySQL转储文件。我需要从中提取CREATE TABLE语句,以便提供表定义。
我购买了Hex Editor Neo,但我有点失望。我创建了一个正则表达式CREATE\s+TABLE(.|\s)*?(?=ENGINE=InnoDB)
来提取CREATE TABLE子句,这似乎在NotePad ++中运行良好。
但是,提取所有实例的ETA超过3小时,我甚至无法确定它是否正确执行。我甚至不知道完成后是否可以导出这些行。
我可以使用grep或其他方法在我的Ubuntu盒子上快速完成此操作吗?
更新
过夜,输出文件空白。我创建了一个较小的数据子集,但该过程仍然无法正常工作。然而,它适用于正则表达式测试程序,但grep不喜欢它并产生空输出。这是我正在运行的命令。我提供了样本,但我不想为我的客户违反保密规定。它只是一个标准的MySQL转储。
grep -oP "CREATE\s+TABLE(.|\s)+?(?=ENGINE=InnoDB)" test.txt > plates_schema.txt
更新
它似乎与CREATE\s+TABLE
部分之后的新行不匹配。
答案 0 :(得分:2)
您可以使用以下内容:
grep -ioP "^CREATE\s+TABLE[\s\S]*?(?=ENGINE=InnoDB)" file.txt > output.txt
答案 1 :(得分:1)
您可以将Perl用于此任务......这应该非常快。
Perl的..
(范围)运算符是有状态的 - 它会记住评估之间的状态。
这意味着:如果您的表格定义以CREATE TABLE
开头,并以ENGINE=InnoDB DEFAULT CHARSET=utf8;
之类的结尾,那么下面会做您想要的。
perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' INPUT_FILE.sql > OUTPUT_FILE.sql
修改强>
由于您正在处理一个非常大的文件,并且可能想知道进度,pv
也可以给您这样做:
pv INPUT_FILE.sql | perl -ne 'print if /CREATE TABLE/../ENGINE=InnoDB/' > OUTPUT_FILE.sql
这将显示进度条,速度和ETA。
答案 2 :(得分:1)
如果您可以再次运行mysqldump,只需添加--no-data
。
答案 3 :(得分:0)
知道了! grep不支持跨多行匹配。我发现了this question helpul而我最终使用了pcregrep。
pcregrep -M "CREATE\s+TABLE(.|\n|\s)+?(?=ENGINE=InnoDB)" test.txt > plates.schema.txt