如何从日志文件创建sql插入脚本

时间:2017-12-17 15:17:07

标签: sql node.js grep

我有一个很长的日志文件。日志文件包含

之类的对象
{someData:"", someData1:"", someData2:"", someData3:""}
{someData:"", someData1:"", someData2:"", someData3:""}
{someData:"", someData1:"", someData2:"", someData3:""}

我的任务是从这些对象生成SQL插入。

基本上我需要像这样生成SQL:

INSERT table_name (someData, someData1) VALUES (?, ?)

问题是:我如何grep日志文件并浏览所有行,并仅选择相关字段来生成具有该对象字段值的插入方法?

2 个答案:

答案 0 :(得分:0)

不是最漂亮的答案,但您可以使用以下awk命令行完成此操作:

awk '{ 
printf "insert into table_name ("; 
    for(i=1; i<=NF; i++) { 
        t=$i; sub(/\:\"[^\"]*\"/, "", t); sub("^\{", "", t); sub("\}$", "", t);  printf t 
    }; 
printf ") values ("; 
    for(i=1; i<=NF; i++) { sub(/^(\{)?[^\:]+\:\"/, "\"", $i); sub("\"\}$" , "\"", $i); printf $i }  
print "); " }' yourdatafilename

<强>解释

awk 是一个逐行操作文本数据的命令行工具。

awk表达式中的

printf 输出值

for(i = 1; i&lt; = NF; i ++)在字段上循环,awk将使用空格作为默认分隔符,因此它将看到{somedata:&#34;&#34 ;,作为第一个字段,在第一行

t = $ i 制作每个字段值的副本,以便我可以在for循环中使用

sub 用一个值替换正则表达式模式,在第一种情况下我只是从输出中删除不需要的部分以保留列名,而在第二种for循环中它&# 39;删除列名仅保留值。

yourdatafilename 是awk从中读取数据的文件名参数,将其替换为您的

答案 1 :(得分:0)

假设您实际上想要输入3行输出,我会使用sed,因为这只是单个行上的简单替换:

$ sed 's/{\([^:]*\)[^ ]* \([^:]*\).*/INSERT table_name (\1, \2) VALUES (?, ?)/' file
INSERT table_name (someData, someData1) VALUES (?, ?)
INSERT table_name (someData, someData1) VALUES (?, ?)
INSERT table_name (someData, someData1) VALUES (?, ?)

或者如果您更喜欢awk:

$ awk -F'[{: ]' '{printf "INSERT table_name (%s, %s) VALUES (?, ?)\n", $2, $4}' file
INSERT table_name (someData, someData1) VALUES (?, ?)
INSERT table_name (someData, someData1) VALUES (?, ?)
INSERT table_name (someData, someData1) VALUES (?, ?)

但这绝对不是grep的工作。 grep表示g/re/p,即全局查找与正则表达式匹配的文本并将其打印出来 - 它不是用于操纵/更改该文本。