笔记记录一下,没有多大作用。仅供参考学习
日志多行合并
{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 脚本会提取第一和最后一个字段并输出。