I have a huge MySQL backup file (from mysqldump) with the tables in alphabetical order. My restore failed and I want to pick up where I left off with the next table in the backup file. (I have corrected the problem, this isn't really a question about MySQL restores, etc.)
What I would like to do is take my backup file, e.g. backup.sql
and trim-off the beginning of the file until I see this line:
-- Table structure for `mytable`
Then everything after that will end up in my result file, say backup-secondhalf.sql
. This is somewhat complicated by the fact that the file is bzip2-compressed, but that shouldn't be too big of a deal.
I think I can do it like this:
$ bunzip2 -c backup.sql.bz2 | grep --text --byte-offset --only-matching -e '--Table structure for table `mytable`' -m 1
This will give me the byte-offset in the file that I want to trim up to. Then:
$ bunzip2 -c backup.sql.bz2 | dd skip=[number from above] | bzip2 -c > backup-secondhalf.sql.bz2
Unfortunately, this requires me to run bunzip2 on the file twice and read-through all those bytes twice.
Is there a way to do this all at once?
I'm not sure my sed-fu is strong enough to do a "delete all lines until regular expression, then let the rest of the file through" expression.
This is on Debian Linux, so I have GNU tools available.
--Table structure
target string? Also, is the target string always at the beginning of a line? If so, then a custom program should work even for arbitrarily long lines (N = length of fixed target string): read a buffer, locate each newline in turn, check for N chars in buffer past the newline (else shift newline to beginning of buffer, fill remainder of buffer), check for target string after the newline, skip to next newline if not found. No need for KMP.grep -m1
followed bycat
would work.