当前位置: 首页 > article >正文

awk脚本和python脚本版本

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

日志多行合并

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

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

import re

def 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 = True
            cli = line  # 存储当前行
            buffer = ""  # 清空 buffer
        elif 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 re

def 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 = True
                cli = line  # 保存当前行
                buffer = ""  # 清空 buffer
            elif 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 re

def 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 = ""  # 重置 prev
            else:
                # 如果当前行不是 INSERT 或 UPDATE,则保存为 prev
                prev = 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 脚本会提取第一和最后一个字段并输出。


http://www.kler.cn/news/342118.html

相关文章:

  • 打破常规,BD仓储物流的效能提升!
  • python xml的读取和写入
  • 【C++网络编程】(一)Linux平台下TCP客户/服务端程序
  • 学习小课堂
  • ssm基于Javaee的影视创作论坛的设计与实现
  • SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
  • 网络风暴产生原因、危害、预防和解决方法
  • 【书生浦语实战】茴香豆企业级知识库问答工具-搭建Dify问答助手
  • k8s 1.28.2 集群部署 MinIO 分布式存储
  • 路径跟踪之导航向量场——二维导航向量场
  • 实景三维赋能地下管线综合智管应用
  • 构建宠物咖啡馆:SpringBoot框架的实现策略
  • 导师面试题库
  • 使用纯CSS和JavaScript来实现一个转盘抽奖效果(设置机率)
  • 基于SpringBoot“花开富贵”花园管理系统【附源码】
  • 深入理解Transformer的笔记记录(精简版本)---- Transformer
  • Vuex 使用实例
  • 多线程-进阶(1)
  • 胤娲科技:00后揭秘——AI大模型的可靠性迷局
  • Could not get JDBC Connection: wait millis 10000, active 500