我偶尔需要从
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时开始流式传输,并在它到达结束时停止
但是这并不像我希望的那样工作,它只会导致输出完整的插入批次.
有人可以给我一些关于我哪里出错的指示吗?
解决方法
根据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来匹配匹配行,那么插入的其余部分可以很容易地编写脚本,然后将所有内容剪切到第一个(