使用Bash脚本读取文件,通过标签解析并插入mysql数据库
我正在做一个bash脚本,逐行读取文件,解析并将其插入mysql数据库 脚本如下所示:使用Bash脚本读取文件,通过标签解析并插入mysql数据库,mysql,regex,bash,file,Mysql,Regex,Bash,File,我正在做一个bash脚本,逐行读取文件,解析并将其插入mysql数据库 脚本如下所示: #!/bin/bash echo "Start!" while IFS=' ' read -ra ADDR; do for line in $(cat filename) do regex='(\d\d)-(\d\d)-(\d\d)\s(\d\d:\d\d:\d\d)' if [[$line=~$regex]] then $line
#!/bin/bash
echo "Start!"
while IFS=' ' read -ra ADDR;
do
for line in $(cat filename)
do
regex='(\d\d)-(\d\d)-(\d\d)\s(\d\d:\d\d:\d\d)'
if [[$line=~$regex]]
then
$line='20$3-$2-$1 $4';
fi
echo "insert into table (time, total, caracas, anzoategui) values('$line', '$line', '$line', $
done | mysql -uuser -ppassword database;
done < filename
而它却放弃了这个:
使用该语句。首先对文件进行任何必须的转换,然后
LOAD DATA LOCAL INFILE 'filename' INTO table (time, total, caracas, anzoategui)
默认情况下,以制表符分隔的字段 Bash使用POSIX字符类。因此,您可以使用
[0-9]
或[[:digit:]]
来匹配数字,而不是\d
此外,在正则表达式测试中,括号和运算符之间必须有空格。因此,[[$line=~$regex]]
将通过执行[[[$line=~$regex]]]
来修复
为了访问括号中的正则表达式,必须访问内置数组变量
BASH\u REMATCH
。因此,要访问第一个匹配,您需要引用${BASH_REMATCH[1]}
,第二个${BASH_REMATCH[2]}
,依此类推。我建议您使用awk
创建sql
文件,然后从mysql
获取它。一旦输出看起来正常,就将其重新定向到一个新文件(比如insert.sql
)中,并从mysql
命令行获取源代码。大概是这样的:
15/08/13 09:34:38 17528 5240 399 89 460 159 1107 33240
15/08/13 09:42:57 17528 5240 399 89 460 159 1107 33240
15/08/13 10:20:03 17492 5217 394 89 459 159 1101 33245
15/08/13 11:20:02 17521 5210 402 90 462 158 1112 33249
15/08/13 12:20:04 17540 5209 396 90 459 160 1105 33258
$ cat file
15/08/13 09:34:38 17528 5240 399 89 460 159 1107 33240
15/08/13 09:42:57 17528 5240 399 89 460 159 1107 33240
15/08/13 10:20:03 17492 5217 394 89 459 159 1101 33245
15/08/13 11:20:02 17521 5210 402 90 462 158 1112 33249
15/08/13 12:20:04 17540 5209 396 90 459 160 1105 33258
$ awk -F'[/ ]+' -v q="'" '{print "insert into table (time, total, caracas, anzoategui) values ("q"20"$3"-"$2"-"$1" "$4q","q$5q","q$6q","q$7q");"}' file
insert into table (time, total, caracas, anzoategui) values ('2013-08-15 09:34:38','17528','5240','399');
insert into table (time, total, caracas, anzoategui) values ('2013-08-15 09:42:57','17528','5240','399');
insert into table (time, total, caracas, anzoategui) values ('2013-08-15 10:20:03','17492','5217','394');
insert into table (time, total, caracas, anzoategui) values ('2013-08-15 11:20:02','17521','5210','402');
insert into table (time, total, caracas, anzoategui) values ('2013-08-15 12:20:04','17540','5209','396');