欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > awk脚本和python脚本版本

awk脚本和python脚本版本

2025/6/19 2:50:33 来源:https://blog.csdn.net/u010674101/article/details/142826218  浏览:    关键词:awk脚本和python脚本版本

笔记记录一下,没有多大作用。仅供参考学习

日志多行合并

{if ($0 ~ /^SELECT|UPDATE|DELETE|INSERT/) {flag = 1buffer = ""gsub(/\n/, "", $0)cli = $0} else if (flag) {if ($0 ~ /;/) {flag = 0print cli buffer $0} else {buffer = buffer $0}} else if (flag == 0) {print $0}
} 

它使用正则表达式来处理 SQL 语句的拼接和打印:

import redef process_sql_lines(lines):flag = False  # 相当于 AWK 中的 flag 变量buffer = ""   # 用于拼接 SQL 语句cli = ""      # 用于存储开始的 SQL 关键字行for line in lines:line = line.strip()  # 去除行首尾的空白字符# 检查是否以 SELECT, UPDATE, DELETE, INSERT 开头if re.match(r'^(SELECT|UPDATE|DELETE|INSERT)', line, re.IGNORECASE):flag = Truecli = line  # 存储当前行buffer = ""  # 清空 bufferelif flag:# 如果 flag 为 True,检查是否包含分号(SQL 结束)if ';' in line:flag = False# 打印拼接的 SQL 语句print(cli + " " + buffer + " " + line)else:buffer += " " + line  # 拼接 SQL 语句的后续行else:# 直接打印不属于 SQL 的行print(line)# 测试
lines = ["SELECT * FROM users","WHERE id = 1;","Some non-SQL text.","INSERT INTO table_name (column1, column2)","VALUES (value1, value2);","Another non-SQL line."
]process_sql_lines(lines)
import redef process_sql_lines_from_file(file_path):flag = False  # 用来标记 SQL 语句是否开始buffer = ""   # 用于拼接 SQL 语句的内容cli = ""      # 保存 SQL 语句的起始行with open(file_path, 'r', encoding='utf-8') as file:for line in file:line = line.strip()  # 去除每行首尾的空白字符# 检查是否以 SELECT, UPDATE, DELETE, INSERT 开头if re.match(r'^(SELECT|UPDATE|DELETE|INSERT)', line, re.IGNORECASE):flag = Truecli = line  # 保存当前行buffer = ""  # 清空 bufferelif flag:# 如果 flag 为 True,检查是否包含分号(SQL 结束)if ';' in line:flag = False# 打印拼接的 SQL 语句print(cli + " " + buffer + " " + line)else:buffer += " " + line  # 拼接 SQL 语句的后续行else:# 打印不属于 SQL 的行print(line)# 调用函数读取 bcs.log 文件
process_sql_lines_from_file('bcs.log')

效果:

SELECT * FROM users WHERE id = 1;
Some non-SQL text.
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
Another non-SQL line.

日志行合并

这个 awk 脚本的目的是将某些特定模式(以 INSERT 或 UPDATE 开头的行)与前一行合并,并用竖线符号 (|) 将它们连接起来。其余的行则保存为前一行以供后续处理。

{if ($0 ~ /^INSERT|UPDATE/) {if (prev) {print prev "|" $0;  # 将上一行与当前行合并} else {print $0;  # 如果没有上一行,则直接打印当前行}prev = "";  # 重置prev} else {prev = $0;  # 保存当前行到prev,准备与下一行合并}
} 
import redef process_file(file_path):prev = ""  # 用于保存前一行with open(file_path, 'r', encoding='utf-8') as file:for line in file:line = line.strip()  # 去除行首尾的空白字符# 检查当前行是否以 INSERT 或 UPDATE 开头if re.match(r'^(INSERT|UPDATE)', line, re.IGNORECASE):if prev:# 如果 prev 有值,合并并打印print(f"{prev}|{line}")else:# 否则直接打印当前行print(line)prev = ""  # 重置 prevelse:# 如果当前行不是 INSERT 或 UPDATE,则保存为 prevprev = line# 调用函数读取并处理文件 bcs.log
process_file('bcs.log')

工作流程:
逐行读取文件内容。
如果当前行是以 INSERT 或 UPDATE 开头,则检查 prev 是否有内容。
如果 prev 有内容,将它与当前行合并并打印。
如果 prev 为空,直接打印当前行。
如果当前行不是 INSERT 或 UPDATE,将其保存为 prev,以备下一次合并。

假设 bcs.log 文件内容为:

Line1
INSERT INTO table (column) VALUES ('value');
Line2
UPDATE table SET column = 'value' WHERE id = 1;

输出将会是:

Line1|INSERT INTO table (column) VALUES ('value');
Line2|UPDATE table SET column = 'value' WHERE id = 1;

日志格式化

{split($0, parts, "|")  # 使用"|"分割每行,并存储在数组parts中first_part = parts[1]  # 第一段是数组的第一个元素last_part = parts[length(parts)]  # 最后一段是数组的最后一个元素print first_part "|" last_part  # 打印第一段和最后一段,用"|"连接
} 
def process_file(file_path):with open(file_path, 'r', encoding='utf-8') as file:for line in file:parts = line.strip().split('|')  # 使用 "|" 分割每行if len(parts) > 1:first_part = parts[0]  # 第一段是数组的第一个元素last_part = parts[-1]  # 最后一段是数组的最后一个元素print(f"{first_part}|{last_part}")  # 打印第一段和最后一段,用"|"连接else:print(line.strip())  # 如果没有"|",则直接打印原始行# 调用函数,处理文件 bcs.log
process_file('bcs.log')

假设文件 bcs.log 内容为:

field1|field2|field3|field4
fieldA|fieldB
only_one_field

输出将会是:

field1|field4
fieldA|fieldB
only_one_field

对于每一行,Python 脚本会提取第一和最后一个字段并输出。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词