
Я хочу извлечь только те строки, которые восстановят определенную таблицу из файла резервной копии mysql. Следующее работает.
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql
Однако размер файла резервной копии составляет 9 ГБ, поэтому я хотел бы прекратить поиск, как только будет найдено конечное совпадение. Поэтому в части 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, чтобы понять, почему. Может быть, кто-то может оставить комментарий, чтобы прояснить это?