
Ich möchte nur die Zeilen extrahieren, die eine bestimmte Tabelle aus einer MySQL-Sicherungsdatei wiederherstellen. Folgendes funktioniert.
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql
Da die Sicherungsdatei jedoch 9 GB groß ist, möchte ich die Suche beenden, sobald die Endübereinstimmung gefunden wurde. Daher könnte ich im sed-Teil des obigen Befehls am Ende {p;q} anstelle von p hinzufügen, wie folgt:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;q}' > account_codes.sql
Das stoppt, aber nach der Übereinstimmung „von“, nicht nach der Übereinstimmung „bis“. Im Wesentlichen ist die Ausgabe dann nur die erste Zeile des gesamten Blocks.
DROP TABLE IF EXISTS `account_codes`;
Wie kann ich das beheben, sodass der q
Befehl nur am Ende wirksam wird, wenn das Muster übereinstimmt?
Antwort1
ich fanddieser Beitrag, mit dem ich meinen sed-Befehl wie folgt geändert habe:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/UNLOCK TABLES/q}' > account_codes.sql
Im Wesentlichen weist es sed an, die übereinstimmenden Zeilen zu suchen und dann zu beenden, wenn es die nächste Zeichenfolge „UNLOCK TABLES“ in der Datei findet.
In der MySQL-Sicherungsdatei steht „UNLOCK TABLES;“, gefolgt von (zum Beispiel)
--
-- Table structure for table `account_table`
--
Wenn ich jedoch den sed-Befehl wie folgt ändere
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 stoppt nicht, wenn es diesen String findet. Ich habe nicht genug Erfahrung mit sed, um herauszufinden, warum das nicht so ist. Vielleicht kann jemand einen Kommentar hinterlassen, um das zu klären?