
我只想提取將從 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 的經驗不夠,無法弄清楚為什麼不這樣做。也許有人可以發表評論來澄清這一點?