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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从日志文件创建sql插入脚本相关的知识,希望对你有一定的参考价值。

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

{someData:"", someData1:"", someData2:"", someData3:""}
{someData:"", someData1:"", someData2:"", someData3:""}
{someData:"", someData1:"", someData2:"", someData3:""}

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

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

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

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

答案

假设你实际上想要输入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 (?, ?)
", $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,即全局查找与正则表达式匹配的文本并打印它 - 它不用于操纵/更改该文本。

另一答案

不是最漂亮的答案,但您可以使用以下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是一个命令行工具,可以逐行处理文本数据。

printf里面的awk表达式输出值

对于(i = 1; i <= NF; i ++)在字段上循环,awk将使用空格作为默认分隔符,因此它将在第一行中看到{somedata:“”作为第一个字段

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

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

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

以上是关于如何从日志文件创建sql插入脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用我自己的脚本使用 php 和 sql 从表单中插入值?

从 Django 创建 SQL 插入脚本以填充 PostgreSQL 数据库

Mysql:如何从其他 sql 脚本文件中调用 sql 脚本文件?

如何去掉控制台上输出的这些日志

从 .txt 文件读取数据并将其插入 Oracle SQL DB [PL/SQL,Unix 脚本]

如何在 Toad for Oracle 中使用自定义代码片段?