我偶尔需要从mysqlbackup中提取单个logging
要做到这一点,我首先从备份中提取我想要的单个表…
sed -n -e '/CREATE TABLE.*usertext/,/CREATE TABLE/p' 20120930_backup.sql > table.sql
在table.sql中,使用扩展插入对logging进行批处理(每插入100条logging,然后创build一个以INSERT INTO开头的新行),所以它们看起来像…
INSERT INTO usertext VALUES (1, field2 etc), (2, field2 etc),
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), ...
我试图从中提取logging239560,使用…
sed -n -e '/(239560.*/,/)/p' table.sql > record.sql
也就是说,当它发现239560时开始stream式传输,当它碰到右括号时停止
但是,这不是我希望的工作,它只是导致完整的插入批输出。
请有人可以给我一些指示,哪里我出错了?
使用awk提取行段,使用sed提取文件中的行会更好吗?
基于伊恩的回答,我已经想出了这个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来捕捉匹配行,然后把所有内容切到第一个
尝试这样的可能会被调整到你的例子,但希望能让你在正确的轨道上
给这样一个input文件
INSERT INTO usertext VALUES (101, field2 etc), (102, field2 etc), (103,filed2, etc), ... sed 's/.*\((102,[^)]*)\),.*/\1/' f (102, field2, etc)
这样做是将你的数据分成3个部分,记住使用(…)的重要部分并将其replace为整行。
.*
你想要的文字前的所有内容 \((102,[^)]*)\)
您的有趣的文字 ,.*
其他所有东西