Syf*_*fys 5 mysql bash awk sed
我尝试过这样的事情
awk -F " " '{if($1=="INSERT"){print $5}}' input.sql | \
sed -e "s/^(//g" -e "s/),(/\n/g" -e "s/['\"]//g" \
-e "s/);$//g" -e "s/,/;/g" > output.txt
Run Code Online (Sandbox Code Playgroud)
但我发现它缓慢且未经优化
MySQL转储文件如下所示
CREATE TABLE MyTable{
data_1,
data_2
};
INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');
INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');
...
INSERT INTO MyTAble VALUES ('data_1','data_2'),...,('data_1','data_2');
Run Code Online (Sandbox Code Playgroud)
我的目标是获取具有以下结果的文件(并且没有'或'来封闭字段):
data_1,data_2
data_1,data_2
...
data_1,data_2
Run Code Online (Sandbox Code Playgroud)
提前致谢!
你可以试试:
gawk '/^INSERT/ {
match ($0,/[^(]*\(([^)]*)\)/,a)
print a[1]
}' input.sql
Run Code Online (Sandbox Code Playgroud)
* 更新 *
再次阅读问题后,也许这更符合您的要求:
/^INSERT/ {
line=$0
while (match (line,/[^(]*\(([^)]*)\)/,a)) {
cur=a[1]
sub(/^['"]/,"",cur)
sub(/['"]$/,"",cur)
print cur
line=substr(line,RSTART+RLENGTH)
}
}
Run Code Online (Sandbox Code Playgroud)
*更新2*
根据问题的最后更新,这里有一个新版本:
/^INSERT/ {
line=$0
while (match (line,/[^(]*\(([^)]*)\)/,a)) {
line=substr(line,RSTART+RLENGTH)
match(a[1],/'([^']*)','([^']*)'/,b)
print b[1]
print b[2]
}
}
Run Code Online (Sandbox Code Playgroud)