我只想提取从 mysql 备份文件恢复特定表的行。以下有效。
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql
但是,备份文件的大小为 9GB,因此我希望在找到结尾匹配项后停止搜索。因此,在上述命令的 sed 部分中,我可以在末尾添加 {p;q} 而不是 p,如下所示:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;q}' > account_codes.sql
它会停止,但在“from”匹配之后,而不是“to”匹配之后。本质上输出只是整个块的第一行。
DROP TABLE IF EXISTS `account_codes`;
我该如何修复这个问题,以便q
命令仅在最后匹配模式时生效?
答案1
我发现这个帖子,我用它来修改我的 sed 命令如下:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/UNLOCK TABLES/q}' > account_codes.sql
本质上,它告诉 sed 找到匹配的行,然后在文件中找到下一个“UNLOCK TABLES”字符串时退出。
在 mysql 备份文件中,“UNLOCK TABLES;”后面跟着(例如)
--
-- Table structure for table `account_table`
--
但是,如果我将 sed 命令修改如下
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/-- Table structure for table/q}' > account_codes.sql
sed 找到该字符串后不会停止。我对 sed 的经验不足,无法弄清楚为什么会这样。也许有人可以发表评论来澄清这一点?