AWK 不仅仅是一个文本处理工具,它是一门完整的编程语言。以下是 AWK 的高级特性分类:#!/bin/bash
# awk-advanced-arrays.sh
echo"=== AWK 高级数组处理 ==="
# 创建复杂的测试数据
cat > sales_data.txt << 'EOF'
2024-01-15,John,Electronics,1200.50,New York
2024-01-15,Jane,Clothing,850.75,Los Angeles
2024-01-15,Bob,Electronics,2100.00,New York
2024-01-16,John,Clothing,450.25,New York
2024-01-16,Jane,Electronics,1800.00,Los Angeles
2024-01-16,Alice,Books,320.50,Chicago
2024-01-17,Bob,Books,280.75,New York
2024-01-17,John,Electronics,950.00,New York
2024-01-17,Jane,Clothing,675.50,Los Angeles
EOF
echo"📊 销售数据:"
column -t -s',' sales_data.txt
echo"========================================"
# 1. 多维统计
echo"1. 📈 多维数据统计 (城市×品类):"
awk -F ',''
{
date = $1
salesperson = $2
category = $3
amount = $4
city = $5
# 多维统计
sales_by_city_category[city][category] += amount
sales_by_date_city[date][city] += amount
salesperson_total[salesperson] += amount
daily_total[date] += amount
# 计数
transaction_count[city][category]++
}
END {
print "=== 城市×品类销售统计 ==="
for (city in sales_by_city_category) {
for (category in sales_by_city_category[city]) {
printf "%-12s %-12s $%8.2f (%d笔)\n",
city, category,
sales_by_city_category[city][category],
transaction_count[city][category]
}
}
print "\n=== 销售员业绩排名 ==="
# 使用asorti对关联数组的索引进行排序
n = asorti(salesperson_total, sorted_salespersons)
for (i = n; i >= 1; i--) {
person = sorted_salespersons[i]
printf "%-8s: $%8.2f\n", person, salesperson_total[person]
}
}' sales_data.txt
# 2. 数组的数组
echo -e "\n2. 🎯 复杂数据结构:"
awk -F ',''
{
city = $5
category = $3
amount = $4
# 创建城市→品类→金额的嵌套结构
if (!(city in city_data)) {
city_data[city]["total"] = 0
city_data[city]["count"] = 0
city_data[city]["categories"] = 0
}
city_data[city]["total"] += amount
city_data[city]["count"]++
if (!(category in city_data[city])) {
city_data[city][category] = 0
city_data[city]["categories"]++
}
city_data[city][category] += amount
}
END {
print "=== 城市详细统计 ==="
for (city in city_data) {
printf "\n🏙️ 城市: %s\n", city
printf " 总销售额: $%.2f\n", city_data[city]["total"]
printf " 交易笔数: %d\n", city_data[city]["count"]
printf " 品类数量: %d\n", city_data[city]["categories"]
# 输出每个品类的销售
for (key in city_data[city]) {
if (key != "total" && key != "count" && key != "categories") {
printf " %-12s: $%8.2f\n", key, city_data[city][key]
}
}
}
}' sales_data.txt
# 清理
rm sales_data.txt
#!/bin/bash
# awk-array-functions.sh
echo"=== AWK 数组函数高级应用 ==="
# 创建测试数据
cat > student_scores.txt << 'EOF'
Alice:Math:95:Physics:88:Chemistry:92
Bob:Math:78:Physics:85:Chemistry:90
Carol:Math:92:Physics:96:Chemistry:94
David:Math:85:Physics:82:Chemistry:88
Eve:Math:91:Physics:89:Chemistry:93
EOF
echo"📊 学生成绩数据:"
cat student_scores.txt
echo"========================================"
# 1. 数组长度和遍历
echo"1. 📏 数组操作函数:"
awk -F ':''
{
student = $1
# 动态创建科目→成绩的映射
for (i = 2; i <= NF; i += 2) {
subject = $i
score = $(i+1)
scores[student][subject] = score
subjects[subject]++ # 记录所有科目
}
}
END {
print "=== 学生成绩统计 ==="
# 获取学生数量
student_count = length(scores)
printf "学生数量: %d\n", student_count
# 获取科目数量
subject_count = length(subjects)
printf "科目数量: %d\n", subject_count
# 遍历所有学生
print "\n📋 学生列表:"
for (student in scores) {
printf "%-8s", student
}
print ""
# 遍历所有科目并计算平均分
print "\n📊 科目平均分:"
for (subject in subjects) {
total = 0
count = 0
for (student in scores) {
if (subject in scores[student]) {
total += scores[student][subject]
count++
}
}
avg = total / count
printf "%-10s: %.1f\n", subject, avg
}
# 删除数组元素示例
print "\n🗑️ 删除Bob的数据后:"
delete scores["Bob"]
for (student in scores) {
printf "%-8s", student
}
print ""
}' student_scores.txt
# 2. 数组复制和比较
echo -e "\n2. 🔄 数组的复制和比较:"
awk '
BEGIN {
# 创建源数组
source["Math"] = 90
source["Physics"] = 85
source["Chemistry"] = 92
print "源数组:"
for (key in source) {
printf " %s: %d\n", key, source[key]
}
# 数组复制(手动)
print "\n复制数组:"
for (key in source) {
copy[key] = source[key]
printf " %s: %d\n", key, copy[key]
}
# 检查数组是否相等
is_equal = 1
for (key in source) {
if (!(key in copy) || source[key] != copy[key]) {
is_equal = 0
break
}
}
if (length(source) != length(copy)) {
is_equal = 0
}
print "\n数组相等:", is_equal ? "是" : "否"
# 修改副本并再次比较
copy["Math"] = 95
is_equal_after = 1
for (key in source) {
if (!(key in copy) || source[key] != copy[key]) {
is_equal_after = 0
break
}
}
print "修改后相等:", is_equal_after ? "是" : "否"
}'
# 清理
rm student_scores.txt
#!/bin/bash
# awk-custom-functions.sh
echo"=== AWK 自定义函数高级应用 ==="
# 创建金融交易数据
cat > transactions.txt << 'EOF'
2024-01-15T10:30:25,INV-001,John Doe,1500.00,COMPLETED
2024-01-15T11:15:30,INV-002,Jane Smith,2750.50,COMPLETED
2024-01-15T12:45:15,INV-003,Bob Johnson,980.75,PENDING
2024-01-15T14:20:40,INV-004,Alice Brown,3200.25,COMPLETED
2024-01-15T15:55:10,INV-005,Charlie Wilson,450.00,FAILED
EOF
echo"💳 交易数据:"
cat transactions.txt
echo"========================================"
# 1. 自定义函数库
echo"1. 🛠️ 自定义函数库实现:"
awk -F ',''
# 函数定义必须在BEGIN之前
function format_amount(amount) {
if (amount >= 1000) {
return sprintf("$%\'d", amount)
} else {
return sprintf("$%.2f", amount)
}
}
function get_status_color(status) {
switch (status) {
case "COMPLETED":
return "✅"
case "PENDING":
return "⏳"
case "FAILED":
return "❌"
default:
return "❓"
}
}
function parse_timestamp(timestamp, datetime, date, time) {
split(timestamp, datetime, "T")
date = datetime[1]
time = datetime[2]
gsub(/-/, "/", date) # 转换日期格式
return date "" time
}
function calculate_tax(amount, rate) {
return amount * rate
}
function generate_report_line(transaction, fields) {
split(transaction, fields, ",")
return sprintf("%s %s %-12s %12s %s",
get_status_color(fields[5]),
parse_timestamp(fields[1]),
fields[3],
format_amount(fields[4]),
fields[5])
}
# 主处理逻辑
{
# 使用自定义函数处理数据
formatted = generate_report_line($0)
print formatted
# 统计信息
total_amount += $4
status_count[$5]++
}
END {
print "\n=== 交易统计 ==="
printf "总交易金额: %s\n", format_amount(total_amount)
printf "平均交易额: %s\n", format_amount(total_amount / NR)
print "\n交易状态分布:"
for (status in status_count) {
printf "%-10s: %d 笔\n", status, status_count[status]
}
# 计算税费示例
tax_rate = 0.08
tax_amount = calculate_tax(total_amount, tax_rate)
printf "\n税费估算 (%.1f%%): %s\n", tax_rate * 100, format_amount(tax_amount)
}' transactions.txt
# 2. 递归函数和数学计算
echo -e "\n2. 🔢 高级数学函数:"
awk '
# 递归计算阶乘
function factorial(n) {
if (n <= 1) return 1
return n * factorial(n - 1)
}
# 计算组合数 C(n, k)
function combination(n, k) {
if (k < 0 || k > n) return 0
return factorial(n) / (factorial(k) * factorial(n - k))
}
# 计算排列数 P(n, k)
function permutation(n, k) {
if (k < 0 || k > n) return 0
return factorial(n) / factorial(n - k)
}
# 主程序
BEGIN {
print "=== 高级数学计算 ==="
# 测试阶乘
print "阶乘计算:"
for (i = 1; i <= 10; i++) {
printf "%-2d! = %d\n", i, factorial(i)
}
# 测试组合数
print "\n组合数计算 C(5, k):"
for (k = 0; k <= 5; k++) {
printf "C(5, %d) = %d\n", k, combination(5, k)
}
# 测试排列数
print "\n排列数计算 P(5, k):"
for (k = 0; k <= 5; k++) {
printf "P(5, %d) = %d\n", k, permutation(5, k)
}
}'
# 清理
rm transactions.txt
#!/bin/bash
# awk-functional-programming.sh
echo"=== AWK 函数式编程特性 ==="
# 创建数据处理示例
cat > numbers.txt << 'EOF'
10 25 38 42 15 67 89 53 21 74
35 18 92 57 63 29 81 46 12 95
EOF
echo"🔢 数字数据:"
cat numbers.txt
echo"========================================"
# 1. 高阶函数应用
echo"1. 🎯 高阶函数模式:"
awk '
# 映射函数 (map)
function map(array, func, i, result) {
for (i in array) {
result[i] = func(array[i])
}
return result
}
# 过滤函数 (filter)
function filter(array, func, i, result, count) {
count = 0
for (i in array) {
if (func(array[i])) {
result[++count] = array[i]
}
}
return result
}
# 归约函数 (reduce)
function reduce(array, func, initial, i, result) {
result = initial
for (i in array) {
result = func(result, array[i])
}
return result
}
# 实用函数
function square(x) { return x * x }
function is_even(x) { return x % 2 == 0 }
function sum(a, b) { return a + b }
function max(a, b) { return a > b ? a : b }
BEGIN {
# 创建测试数组
numbers[1] = 10; numbers[2] = 25; numbers[3] = 38; numbers[4] = 42
numbers[5] = 15; numbers[6] = 67; numbers[7] = 89; numbers[8] = 53
numbers[9] = 21; numbers[10] = 74
print "原始数组:", array_to_string(numbers)
# 使用map
squared = map(numbers, square)
print "平方映射:", array_to_string(squared)
# 使用filter
evens = filter(numbers, is_even)
print "偶数过滤:", array_to_string(evens)
# 使用reduce
total = reduce(numbers, sum, 0)
maximum = reduce(numbers, max, numbers[1])
print "总和归约:", total
print "最大值归约:", maximum
# 函数组合: 先过滤偶数,再求平方,最后求和
result = reduce(map(filter(numbers, is_even), square), sum, 0)
print "组合操作结果:", result
}
function array_to_string(arr, i, str) {
str = ""
for (i = 1; i <= length(arr); i++) {
str = str (str ? ", " : "") arr[i]
}
return "[" str "]"
}'
# 2. 闭包和柯里化
echo -e "\n2. 🔗 闭包和柯里化模式:"
awk '
# 柯里化函数:创建特定乘数的函数
function multiplier(factor) {
return function(x) { return x * factor }
}
# 闭包示例:计数器工厂
function counter(initial) {
var count = initial
return function() { return ++count }
}
# 记忆化函数
function memoize(func, cache) {
return function(arg) {
if (!(arg in cache)) {
cache[arg] = func(arg)
}
return cache[arg]
}
}
BEGIN {
print "=== 函数式编程模式 ==="
# 柯里化应用
double = multiplier(2)
triple = multiplier(3)
print "柯里化测试:"
printf "double(5) = %d\n", double(5)
printf "triple(5) = %d\n", triple(5)
# 闭包应用
count1 = counter(0)
count2 = counter(100)
print "\n闭包计数器:"
print "计数器1:", count1(), count1(), count1()
print "计数器2:", count2(), count2(), count2()
# 记忆化应用
memoized_factorial = memoize(function(n) {
if (n <= 1) return 1
return n * memoized_factorial(n - 1)
})
print "\n记忆化阶乘:"
print "10! =", memoized_factorial
AWK 提供了强大的字符串处理能力,以下是主要功能分类: | | |
| | |
| | |
| | |
| toupper, tolower, strtonum | |
| | |
#!/bin/bash
# awk-string-basics.sh
echo"=== AWK 基础字符串操作 ==="
# 创建测试数据
cat > string_data.txt << 'EOF'
Hello World
AWK Programming
Linux System Administration
test@example.com
+1-555-0123
2024-01-15T14:30:00
EOF
echo"📝 测试字符串数据:"
cat string_data.txt
echo"========================================"
# 1. 基础字符串函数
echo"1. 🔧 基础字符串函数演示:"
awk '
{
print "原始字符串:", $0
print "字符串长度:", length($0)
# substr 提取子串
if (length($0) >= 5) {
print "前5个字符:", substr($0, 1, 5)
print "后5个字符:", substr($0, length($0)-4, 5)
}
# index 查找位置
pos = index($0, " ")
if (pos > 0) {
print "第一个空格位置:", pos
}
print "---"
}' string_data.txt
# 2. 大小写转换和字符操作
echo -e "\n2. 🔄 大小写和字符处理:"
awk '
{
print "原始:", $0
print "大写:", toupper($0)
print "小写:", tolower($0)
# 首字母大写
if ($0 != "") {
first_char = substr($0, 1, 1)
rest_chars = substr($0, 2)
print "首字母大写:", toupper(first_char) tolower(rest_chars)
}
print "---"
}' string_data.txt
#!/bin/bash
# awk-regex-advanced.sh
echo"=== AWK 高级正则表达式处理 ==="
# 创建复杂文本数据
cat > complex_text.txt << 'EOF'
Contact: john.doe@example.com, phone: +1-555-0123
Meeting: 2024-01-15T14:30:00 at Office-123
Price: $1,299.99, Discount: 15%
IP: 192.168.1.1, Mask: 255.255.255.0
JSON: {"name": "John", "age": 30, "active": true}
EOF
echo"📄 复杂文本数据:"
cat complex_text.txt
echo"========================================"
# 1. match 函数的高级用法
echo"1. 🎯 match 函数捕获组:"
awk '
{
# 匹配邮箱并提取用户名和域名
if (match($0, /([a-zA-Z0-9._%+-]+)@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/, arr)) {
print "📧 邮箱匹配:"
print " 完整邮箱:", arr[0]
print " 用户名:", arr[1]
print " 域名:", arr[2]
}
# 匹配价格格式
if (match($0, /\$[0-9,]+(\.[0-9]{2})?/, arr)) {
print "💰 价格匹配:", arr[0]
}
# 匹配日期时间
if (match($0, /[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}/, arr)) {
print "📅 时间匹配:", arr[0]
}
print "---"
}' complex_text.txt
# 2. gensub 高级替换
echo -e "\n2. 🔄 gensub 高级替换模式:"
awk '
{
original = $0
# 使用gensub进行复杂替换
# 替换邮箱域名
email_replaced = gensub(/([a-zA-Z0-9._%+-]+)@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/,
"\\1@company.com", "g", $0)
# 隐藏电话号码
phone_replaced = gensub(/\+?[0-9-]{10,}/,
"***-***-****", "g", email_replaced)
# 格式化价格
formatted = gensub(/\$([0-9,]+(\.[0-9]{2})?)/,
"💰 \\1", "g", phone_replaced)
print "原始:", original
print "处理后:", formatted
print "---"
}' complex_text.txt
#!/bin/bash
# awk-multi-pattern.sh
echo"=== AWK 多模式匹配处理 ==="
# 创建多模式测试数据
cat > multi_pattern.txt << 'EOF'
ERROR: Database connection failed at 2024-01-15 14:30
WARNING: High memory usage: 85%
INFO: User login: john@example.com
DEBUG: Query executed in 150ms
ERROR: File not found: /path/to/file.txt
INFO: Backup completed successfully
EOF
echo"📋 日志模式数据:"
cat multi_pattern.txt
echo"========================================"
# 复杂多模式匹配和提取
awk '
{
# 定义匹配模式数组
patterns["ERROR"] = "❌"
patterns["WARNING"] = "⚠️ "
patterns["INFO"] = "ℹ️ "
patterns["DEBUG"] = "🐛"
# 检查每种模式
for (pattern in patterns) {
if (match($0, pattern ": ([^:]+):? (.+)", arr)) {
print patterns[pattern] " " pattern ":"
print " 消息:", arr[2]
# 提取额外信息
if (pattern == "ERROR" && match($0, /at ([0-9:-]+)/, time_arr)) {
print " 时间:", time_arr[1]
}
if (match($0, /([0-9]+)%/, percent_arr)) {
print " 百分比:", percent_arr[1] "%"
}
if (match($0, /in ([0-9]+ms)/, time_arr)) {
print " 耗时:", time_arr[1]
}
break
}
}
}' multi_pattern.txt
#!/bin/bash
# awk-split-advanced.sh
echo"=== AWK 高级字符串分割 ==="
# 创建需要分割的数据
cat > split_data.txt << 'EOF'
name=John Doe;age=30;city=New York;email=john@example.com
name=Jane Smith;age=25;city=Los Angeles;phone=555-0123
name=Bob Wilson;age=35;department=Engineering;salary=75000
EOF
echo"🔗 键值对数据:"
cat split_data.txt
echo"========================================"
# 1. 复杂分割和数据结构构建
echo"1. 🧩 多级分割和数据结构:"
awk -F ';''
{
print "处理记录:", NR
# 第一级分割:分号分隔
for (i = 1; i <= NF; i++) {
# 第二级分割:等号分隔
split($i, keyvalue, "=")
if (length(keyvalue) >= 2) {
key = keyvalue[1]
value = keyvalue[2]
# 存储到多维数组
data[NR][key] = value
all_keys[key]++ # 记录所有出现的key
}
}
}
END {
print "\n📊 数据统计:"
# 输出表格格式
printf "%-6s", "Record"
for (key in all_keys) {
printf "%-15s", key
}
print ""
# 输出分隔线
printf "%-6s", "------"
for (key in all_keys) {
printf "%-15s", "---------------"
}
print ""
# 输出数据
for (record in data) {
printf "%-6d", record
for (key in all_keys) {
value = (key in data[record]) ? data[record][key] : "N/A"
printf "%-15s", value
}
print ""
}
}' split_data.txt
# 2. CSV 和复杂分隔符处理
echo -e "\n2. 📋 CSV 和复杂格式处理:"
cat > complex_csv.txt << 'EOF'
"John Doe",30,"New York, NY","john@example.com"
"Jane Smith",25,"Los Angeles, CA","jane.smith@company.com"
"Bob ""The Boss"" Johnson",35,"Chicago, IL","bob@test.org"
EOF
awk '
BEGIN {
FPAT = "([^,]*)|(\"[^\"]+\")" # 处理带引号的字段
}
{
print "记录", NR ":"
for (i = 1; i <= NF; i++) {
# 移除引号
gsub(/^\"|\"$/, "", $i)
gsub(/\"\"/, "\"", $i) # 处理转义引号
printf " 字段%d: %s\n", i, $i
}
print "---"
}' complex_csv.txt
#!/bin/bash
# awk-log-analysis.sh
echo "=== AWK 日志文件分析实战 ==="
# 创建模拟的Web服务器日志
cat > web_server.log << 'EOF'
192.168.1.1 - - [15/Jan/2024:10:30:25 +0800] "GET /index.html HTTP/1.1" 200 1524 "http://example.com" "Mozilla/5.0"
192.168.1.2 - - [15/Jan/2024:10:30:26 +0800] "GET /about.html HTTP/1.1" 200 2345 "http://example.com" "Mozilla/5.0"
192.168.1.3 - - [15/Jan/2024:10:30:27 +0800] "POST /login HTTP/1.1" 302 0 "http://example.com" "Chrome/91.0"
192.168.1.1 - - [15/Jan/2024:10:30:28 +0800] "GET /products HTTP/1.1" 200 5678 "http://example.com" "Firefox/89.0"
192.168.1.4 - - [15/Jan/2024:10:30:29 +0800] "GET /nonexistent HTTP/1.1" 404 123 "http://example.com" "Safari/14.0"
192.168.1.2 - - [15/Jan/2024:10:30:30 +0800] "GET /api/data HTTP/1.1" 200 3456 "http://example.com" "Mozilla/5.0"
EOF
echo "🌐 Web服务器日志:"
cat web_server.log
echo "========================================"
# 高级日志分析
awk '
{
# 使用match提取日志字段
if (match($0, /^([0-9.]+) .* \[(.*)\] "(.*)" ([0-9]+) ([0-9]+) "(.*)" "(.*)"/, arr)) {
ip = arr[1]
timestamp = arr[2]
request = arr[3]
status = arr[4]
bytes = arr[5]
referer = arr[6]
user_agent = arr[7]
# 进一步解析请求
if (match(request, /^([A-Z]+) (.*) HTTP/, req_arr)) {
method = req_arr[1]
path = req_arr[2]
# 统计信息
ip_count[ip]++
status_count[status]++
method_count[method]++
total_bytes += bytes
# 路径分析
if (match(path, "^/[^/?]*", path_arr)) {
endpoint = path_arr[0]
endpoint_count[endpoint]++
endpoint_bytes[endpoint] += bytes
}
}
}
}
END {
print "📊 访问统计报告"
print "================"
# IP统计
print "\n🌐 客户端IP统计:"
for (ip in ip_count) {
printf "%-15s: %d次访问\n", ip, ip_count[ip]
}
# 状态码统计
print "\n📋 HTTP状态码分布:"
for (status in status_count) {
printf "%-4s: %d次\n", status, status_count[status]
}
# 方法统计
print "\n🛠️ 请求方法统计:"
for (method in method_count) {
printf "%-6s: %d次\n", method, method_count[method]
}
# 端点统计
print "\n📍 热门端点:"
for (endpoint in endpoint_count) {
if (endpoint_count[endpoint] > 1) {
avg_size = endpoint_bytes[endpoint] / endpoint_count[endpoint]
printf "%-12s: %d次访问, 平均%.0f字节\n",
endpoint, endpoint_count[endpoint], avg_size
}
}
# 总体统计
print "\n📈 总体统计:"
printf "总请求数: %d\n", NR
printf "总流量: %.1fKB\n", total_bytes / 1024
printf "平均请求大小: %.0f字节\n", total_bytes / NR
}' web_server.log
# 清理
rm web_server.log
#!/bin/bash
# awk-config-processing.sh
echo"=== AWK 配置文件处理实战 ==="
# 创建复杂的配置文件
cat > app_config.conf << 'EOF'
# Database Configuration
db.host = mysql.example.com
db.port = 3306
db.name = myapp_db
db.user = admin
db.password = secret123
# Server Settings
server.host = 0.0.0.0
server.port = 8080
server.timeout = 30
server.ssl.enabled = true
server.ssl.cert = /path/to/cert.pem
# Logging
log.level = INFO
log.file = /var/log/app.log
log.max_size = 100MB
# Feature Flags
features.api.enabled = true
features.ui.enabled = false
features.debug.mode = false
EOF
echo"⚙️ 配置文件内容:"
cat app_config.conf
echo"========================================"
# 高级配置文件处理
awk '
function parse_section(line, parts) {
if (match(line, /^# ([A-Za-z ]+)$/, arr)) {
current_section = arr[1]
sections[current_section] = ""
return 1
}
return 0
}
function parse_setting(line, key, value, parts) {
if (match(line, /^([a-zA-Z0-9._]+) *= *(.*)$/, arr)) {
key = arr[1]
value = arr[2]
# 移除行尾注释
gsub(/#.*$/, "", value)
gsub(/^ *| *$/, "", value) # 去除首尾空格
# 存储配置
settings[key] = value
setting_sections[key] = current_section
# 按section分组
section_settings[current_section][key] = value
return 1
}
return 0
}
{
# 跳过空行
if ($0 ~ /^[[:space:]]*$/) next
# 解析section
if (!parse_section($0)) {
# 解析配置项
if (!parse_setting($0)) {
print "无法解析行:", NR ": " $0 > "/dev/stderr"
}
}
}
END {
print "📋 配置分析报告"
print "================"
# 按section输出配置
print "\n📁 配置分组:"
for (section in sections) {
print "\n" section ":"
print "---------"
for (key in section_settings[section]) {
value = section_settings[section][key]
printf "%-20s = %s\n", key, value
}
}
# 统计信息
print "\n📊 配置统计:"
printf "总配置项数: %d\n", length(settings)
printf "配置段落数: %d\n", length(sections)
# 敏感信息检查
print "\n🔒 敏感信息检查:"
sensitive_patterns["password"] = "密码"
sensitive_patterns["secret"] = "密钥"
sensitive_patterns["cert"] = "证书"
for (key in settings) {
for (pattern in sensitive_patterns) {
if (index(tolower(key), pattern) > 0) {
printf "