concact_sql.awk 脚本如下
{
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
}
}
这个 awk
脚本的目的是处理 SQL 语句,特别是跨多行的 SELECT
、UPDATE
、DELETE
、INSERT
类型的 SQL 查询语句。脚本通过将多行拼接成一行并在 SQL 语句的末尾遇到分号(;
)时打印出来。让我们逐步分析:
1. if ($0 ~ /^SELECT|UPDATE|DELETE|INSERT/)
- 这条语句检查当前行是否以
SELECT
、UPDATE
、DELETE
或INSERT
开头。 - 如果匹配到这些关键字,意味着该行是一个 SQL 查询的开始。
- 如果条件满足,将
flag
变量设置为1
,表示我们进入了一个 SQL 语句的处理阶段。 - 还初始化了
buffer
为空字符串,并将当前行的换行符去掉(gsub(/\n/, "", $0)
),然后将当前行赋值给cli
变量。
2. else if (flag)
- 如果
flag
已经被设置为1
,说明我们正在处理一个多行的 SQL 语句。 - 该部分检查当前行是否包含
;
,即 SQL 语句的结束符。- 如果找到了分号(
if ($0 ~ /;/)
),将flag
重置为0
,表示 SQL 语句结束。 - 然后将前面累积的内容(
cli
和buffer
)以及当前行拼接起来并打印出来。 - 如果当前行没有分号(SQL 语句尚未结束),则继续将当前行的内容拼接到
buffer
中。
- 如果找到了分号(
3. else if (flag == 0)
- 如果
flag == 0
,说明当前行不属于 SQL 语句的一部分,直接输出该行。
总结
这个 awk
脚本处理 SQL 查询语句时,会识别 SELECT
、UPDATE
、DELETE
和 INSERT
开头的 SQL 语句,并将可能分布在多行的 SQL 语句拼接成一行,直到遇到分号结束语句。脚本中的其他内容则会原样输出。
使用方法
awk -f concact_sql.awk bcs1.log > new.log