Tôi có một tệp sao lưu MySQL khổng lồ (từ mysqldump) với các bảng theo thứ tự bảng chữ cái. Quá trình khôi phục của tôi không thành công và tôi muốn tiếp tục từ nơi tôi đã dừng lại với bảng tiếp theo trong tệp sao lưu. (Tôi đã khắc phục sự cố, đây thực sự không phải là câu hỏi về khôi phục MySQL, v.v.)
Điều tôi muốn làm là lấy tệp sao lưu của mình, ví dụ: sao lưu.sql
và cắt bỏ phần đầu của tệp cho đến khi tôi thấy dòng này:
-- Cấu trúc bảng cho `mytable`
Sau đó, mọi thứ sau đó sẽ kết thúc trong tệp kết quả của tôi, giả sử backup-secondhalf.sql
. Điều này hơi phức tạp bởi thực tế là tệp được nén bzip2, nhưng đó không phải là vấn đề quá lớn.
Tôi nghĩ rằng tôi có thể làm điều đó như thế này:
$ bunzip2 -c backup.sql.bz2 | grep --text --byte-offset --only-matching -e '--Cấu trúc bảng cho bảng `mytable`' -m 1
Điều này sẽ cung cấp cho tôi phần bù byte trong tệp mà tôi muốn cắt lên đến. Sau đó:
$ bunzip2 -c backup.sql.bz2 | dd bỏ qua=[số từ trên] | bzip2 -c > backup-secondhalf.sql.bz2
Thật không may, điều này yêu cầu tôi chạy bunzip2 trên tệp hai lần và đọc qua tất cả các byte đó hai lần.
Có cách nào để làm điều này tất cả cùng một lúc?
Tôi không chắc sed-fu của mình đủ mạnh để thực hiện biểu thức "xóa tất cả các dòng cho đến khi biểu thức chính quy, sau đó để phần còn lại của tệp thông qua".
Đây là trên Debian Linux, vì vậy tôi có sẵn các công cụ GNU.