如何让sed匹配到结束模式后停止,完整提取MySQL备份中指定表的恢复语句
如何让sed匹配到结束模式后停止,完整提取MySQL备份中指定表的恢复语句
兄弟,太懂你处理9G超大MySQL备份文件的痛点了——全量读取一遍不仅慢还占资源,之前试的sed写法要么得跑完整个文件,要么提前终止只拿到开头那一行,属实闹心。
别慌,咱们调整一下sed的逻辑就能解决:让它在匹配到结束模式之后再退出,而不是刚进入匹配区间就停。试试这个命令:
zcat /mnt/backup/full-replication.gz | sed -n '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p; /UNLOCK TABLES/q}' > account_codes.sql
为啥这个写法管用?
咱们拆解一下逻辑:
-n让sed默认不输出任何行,只打印我们指定的内容/DROP TABLE.*account_codes/,/UNLOCK TABLES/定义了要提取的行区间:从匹配到DROP TABLE IF EXISTS account_codes的行开始,到匹配到UNLOCK TABLES的行结束- 大括号里的
p表示打印当前行;后面的/UNLOCK TABLES/q是个条件判断:只有当当前行匹配到结束标记UNLOCK TABLES时,才执行q(退出sed)
这样一来,sed会完整打印整个表的恢复语句块,等打印完最后一行UNLOCK TABLES;之后立刻停止处理,不会再去读后面的9G内容,效率直接拉满。
你可以先用小备份文件测试一下,确认输出是从DROP到UNLOCK的完整语句块,再跑大文件更稳妥~
备注:内容来源于stack exchange,提问作者Lifeboy
相关产品推荐
相关产品推荐

