awk\grep\sed调优、常见错误及解决方法
标签搜索

awk\grep\sed调优、常见错误及解决方法

mrui
2025-09-10 / 0 评论 / 3 阅读 / 正在检测是否收录...

性能调试

# 测试命令执行时间
time grep "pattern" large_file.log

# 查看命令的系统调用
strace -c grep "pattern" file.log

# 监控内存使用
/usr/bin/time -v awk '{sum += $1} END {print sum}' numbers.txt

内存使用优化

# 避免将整个文件加载到内存
awk 'BEGIN {while ((getline line < "huge_file.log") > 0) print line}' /dev/null

# 使用管道减少临时文件
grep "pattern" file.log | awk '{print $1}' | sort | uniq -c > result.txt

# 分块处理大文件
split -l 100000 huge_file.log chunk_
for chunk in chunk_*; do
    awk '{sum += $10} END {print FILENAME, sum}' "$chunk"
done | awk '{total += $2} END {print "Total:", total}'

常见错误

# 1. 正则表达式不匹配
# 错误示例
grep "192\.168\.1\.1" file.log  # 转义过度
# 正确写法
grep "192.168.1.1" file.log    # 基本正则不需要转义点号

# 2. awk字段分隔符问题
# 处理CSV文件
awk -F',' '{print $2}' data.csv

# 处理多种分隔符
awk -F'[,:]' '{print $1, $3}' mixed.txt

# 3. sed替换路径问题
# 错误示例
sed 's//old/path//new/path/g' file.txt  # 分隔符冲突
# 正确写法
sed 's|/old/path|/new/path|g' file.txt  # 使用不同分隔符

高级技巧和最佳实践

处理特殊字符


find . -name "*.log" -print0 | xargs -0 grep "pattern"

# 处理二进制文件
grep -a "text" binary_file  # 强制当作文本处理

# 处理不同编码的文件
iconv -f gbk -t utf-8 chinese.log | grep "关键词"

组合命令

# 复杂的日志分析流水线
tail -f access.log | \
grep --line-buffered "POST" | \
awk '{print strftime("%H:%M:%S"), $1, $7}' | \
while read time ip url; do
    echo "[$time] $ip 访问了 $url"
done

# 实时监控错误日志
tail -f error.log | \
grep --line-buffered -E "(ERROR|FATAL)" | \
sed -u 's/^/[ALERT] /' | \
tee -a alert.log

脚本化和自动化

analyze_nginx_log() {
    local logfile=$1
    local pattern=${2:-""}
    
    if [ -n "$pattern" ]; then
        grep "$pattern" "$logfile" | awk '{print $1}' | sort | uniq -c | sort -nr
    else
        awk '{print $1}' "$logfile" | sort | uniq -c | sort -nr
    fi
}

# 使用函数
analyze_nginx_log "/var/log/nginx/access.log" "404"
0

评论 (0)

取消