Mysql

使用 sed 提取 mysql 備份的行部分

  • October 9, 2012

我偶爾需要從 mysqlbackup中提取一條記錄

為此,我首先從備份中提取我想要的單個表……

sed -n -e '/CREATE TABLE.*usertext/,/CREATE TABLE/p' 20120930_backup.sql > table.sql

在 table.sql 中,使用擴展插入對記錄進行批處理(在創建以 INSERT INTO 開頭的新行之前,每個插入可能有 100 條記錄),所以它們看起來像……

INSERT INTO usertext VALUES (1, field2 etc), (2, field2 etc),

INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), ...

我試圖從中提取記錄 239560,使用…

sed -n -e '/(239560.*/,/)/p' table.sql > record.sql

即.. 找到 239560 時開始流式傳輸,並在遇到右括號時停止

但這並沒有像我希望的那樣工作,它只會導致輸出完整的插入批次。

請有人能給我一些關於我哪裡出錯的指示嗎?

使用 awk 提取行段並使用 sed 提取文件中的行會更好嗎?

根據 Iain 的回答,我想出了這個 sed 技巧……

$ sed  's/\(INSERT[^(]*\).*\((239560,[^)]*)\),.*/\1\2/' sample.sql | tee 1-record.sql
INSERT INTO usertext VALUES (239560, 2, 3, 4)
$ 

– 不使用 sed 的變化…您可以提取僅匹配該數字的某些行/插入的值。

$ cat sample.sql
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (239560, 2, 3, 4), (5, 8, 9)
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (1239560, 2, 3, 4), (5, 8, 9)
$ egrep -o '(\(239560\,[^)]+\))' sample.sql        
(239560, 2, 3, 4)
$ 

如果您使用 -n 開關和 grep 來擷取匹配行,然後將所有內容剪切到第一個(

引用自:https://serverfault.com/questions/435699