使用 sed 提取 mysql 备份的某一行

使用 sed 提取 mysql 备份的某一行

我偶尔需要提取一个记录来自 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 来提取文件内的行?

答案1

根据 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 来捕获匹配的行,然后只需将所有内容剪切到第一行(,则可以轻松编写插入的其余部分脚本

答案2

尝试类似这样的方法,可能会针对您的示例进行调整,但希望可以让您走上正确的轨道

给定一个像这样的输入文件

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

sed  's/.*\((102,[^)]*)\),.*/\1/' f
(102, field2, etc)

这样做的目的是将您的数据分成 3 个部分,使用 (...) 记住重要部分,并用其替换整行。

  • .*您想要的文本之前的所有内容
  • \((102,[^)]*)\)你的有趣文字
  • ,.*其他一切

相关内容