【发布时间】:2013-01-08 18:05:46
【问题描述】:
我关注this guide 使用 grep 从 mysql 转储中提取表,因此我不必恢复所有 50GB 的数据来查看一个表。拉表的两个主要命令是:
grep -n "Table structure" [MySQL_dump_filename].sql
获取表定义的行号,然后
sed -n '[starting_line_number],[ending_line_number] p' [MySQL_dump_filename].sql > [table_output_filename].sql
不过,我想以相反的顺序搜索 .sql 转储,因为我需要的是接近文件末尾的内容,并且需要很长时间才能 grep 前 48GB 的数据。我在 OS X 上并安装了 tac(通过 brew 指出 here)。但是是否可以设置命令来完成此操作并在 sed 获取所需的行后退出?如果不是,我还不如从一开始就 grep 而不是 tac,就等着吧。或者,当我看到文件填充在另一个终端中时,按 ctrl-c。
示例运行:
$ tac dump.sql | grep -n "Table structure"
...
751:-- Table structure for table `answer`
779:-- Table structure for table `template`
806:-- Table structure for table `resource`
...
当然,这些是相反的行号,所以如果你需要'模板'表,你需要 sed -n '752,779 p',但从文件末尾开始,否则你会得到错误的行编号(sed 将从文件开头开始计数)。
【问题讨论】:
-
grep可以在几分钟内粉碎千兆字节的数据,尤其是较新的 GNU 版本。不过,为什么不使用 Ruby、Python 或 Perl 等脚本语言一次性完成呢?