我试图以上述格式获取多行文件,并从中插入MySQL语句。最终结果目标类似于输出: -
insert into ansible_db (ip, version) values ("$ip", "$version")
以下每个数据示例的每行(这是输入文件,我想要IP地址和msg段的结果 - 即4.0.3): -
ok: [192.168.0.214] => {s "msg": "4.0.3"s}
ok: [192.168.0.210] => {s "msg": "4.0.8"s}
ok: [192.168.0.208] => {s "msg": "fdsajkghjfdka"s}
ok: [192.168.0.216] => {s "msg": "Potatoes""""s}
以下greps会正确地获取IP和消息: -
$ip=grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
$version= grep -oP '(?<=\"\: \").*(?=\"s})' #format of the message will vary going forward.
我想把它放在一个循环中,但我正在挣扎。任何建议表示赞赏
答案 0 :(得分:1)
在这种情况下,不需要while循环。如果您的文件具有与您在下面的问题中提供的一致结构,则应打印所需的行。
awk -v FS='[][]|"' '{print "insert into ansible_db (ip, version) values ( \""$2 "\" , \""$6"\" )" }' yourInputFile
注意,上面的命令会在std out中显示结果,如果你想执行那么你可以在命令的末尾使用|bash
,如:
awk -v FS='[][]|"' '{print "insert into ansible_db (ip, version) values ( "$2 " , "$6" )" }' yourInputFile |bash
答案 1 :(得分:0)
注意, MySql VALUES
语法要求复杂字符串参数用引号括起来。
要获取有效的MySql插入语句,请使用以下方法:
awk '{ gsub(/[\[\]]/,"",$2); sub("\"+s}","\"",$6);
print "insert into ansible_db (ip, version) values (\""$2"\", "$6");" }' file
输出:
insert into ansible_db (ip, version) values ("192.168.0.214", "4.0.3");
insert into ansible_db (ip, version) values ("192.168.0.210", "4.0.8");
insert into ansible_db (ip, version) values ("192.168.0.208", "fdsajkghjfdka");
insert into ansible_db (ip, version) values ("192.168.0.216", "Potatoes");