You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化嵌套循环实现文本提取/处理的Bash脚本性能

优化Bash日志资源提取脚本的性能方案

核心思路

原脚本性能低下的核心原因是过度依赖Bash内部循环处理每行/每个资源——Bash的循环迭代开销极高,尤其在处理数千行数据时会被放大。优化方向是将大部分逻辑交给C实现的系统工具(awk、sort)完成,仅用Bash做流程调度,避免逐行/逐元素的Bash循环。

优化后的完整脚本

假设分隔符$SEP为&,可直接替换为你的实际分隔符:

#!/bin/bash
SEP='&'
input_file="your_input.log"
output_file="unique_resources.txt"

# 用awk批量处理日志,提取资源后交给sort去重排序
awk -v sep="$SEP" '
{
    # 定位最后一组方括号的起始位置
    last_open = index($0, "[")
    while (index(substr($0, last_open+1), "[") != 0) {
        last_open += index(substr($0, last_open+1), "[")
    }
    if (last_open == 0) next  # 无方括号则跳过该行

    # 定位对应闭合括号的位置
    close_pos = index(substr($0, last_open), "]")
    if (close_pos == 0) next  # 无匹配闭合括号则跳过

    # 提取括号内的内容
    content = substr($0, last_open+1, close_pos-2)
    if (content == "") next  # 括号内容为空则跳过

    # 拆分资源并修剪前后空格
    n = split(content, arr, sep)
    for (i=1; i<=n; i++) {
        gsub(/^[[:space:]]+|[[:space:]]+$/, "", arr[i])
        if (arr[i] != "") print arr[i]
    }
}
' "$input_file" | sort -u > "$output_file"

关键优化点说明

  1. 批量提取与处理:

    • 用awk一次性处理整个日志文件,仅启动一次进程,避免原脚本中每行调用sed/Bash函数的进程创建开销。
    • awk内部通过字符串操作精准定位最后一组方括号,兼容行内多组括号的场景。
  2. 高效去重排序:

    • 放弃Bash关联数组去重,改用sort -u——这是专门的排序去重工具,内部实现高效排序算法(如快速排序),批量处理数据的速度远高于Bash循环逐个存入数组的逻辑。
  3. 边界情况兼容:

    • 自动跳过无方括号、括号无闭合、括号内容为空的行。
    • 用gsub修剪每个资源的前后空格,确保输出干净的资源名称,同时跳过修剪后为空的元素。

特殊分隔符处理

如果$SEP是正则特殊字符(如|、*),需要在传递给awk时转义,例如:

SEP='|'
# 转义后传递给awk
awk -v sep="\\|" '...' "$input_file" | sort -u > "$output_file"

性能对比

原脚本处理5000-10000行日志需12-30分钟,优化后的脚本仅需数秒即可完成,性能提升几个数量级。

内容的提问来源于stack exchange,提问作者Moussa Amrani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 07:53:24