使用sed提取mysql备份的一行部分

前端之家收集整理的这篇文章主要介绍了使用sed提取mysql备份的一行部分前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我偶尔需要从 mysqlbackup中提取单个记录

为此,我首先从备份中提取我想要的单个表…

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

在table.sql中,记录使用扩展插入进行批处理(每个插入可能有100条记录,然后创建一个以INSERT INTO开头的新行),所以它们看起来像……

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

INSERT INTO usertext VALUES(101,(102,…

我试图从中提取记录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),(239560,4),(5,8,9)
INSERT INTO usertext VALUES (101,(1239560,9)
$egrep -o '(\(239560\,[^)]+\))' sample.sql        
(239560,4)
$

如果你使用-n开关和grep来匹配匹配行,那么插入的其余部分可以很容易地编写脚本,然后将所有内容剪切到第一个(

猜你在找的Linux相关文章