使用Grep在每行循环中创建多个变量 - BASH

时间:2017-09-25 11:44:04

标签: mysql bash loops while-loop grep

我试图以上述格式获取多行文件,并从中插入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. 

我想把它放在一个循环中,但我正在挣扎。任何建议表示赞赏

2 个答案:

答案 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");