我正在关注 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 将从文件的开头开始计数)。
最佳答案
一些快速提示:
dd
可以帮助您跳过非常快 N 字节/ block /无论您确定前 N gb 没有用跳过后,无需 1)
grep
查找行号然后 2)sed
跳过直到行号 n(读取剩余的两倍) : 你可以直接:awk '/beginningpattern/,/endpattern/{ 打印 $0 ; }'
#warning: 语法不完整,最好阅读 awk 及其强大功能。你可以做各种整洁的事情。
关于mysql - 使用 tac、grep 和 sed 从 MySQL 转储中提取表...反向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221302/