性能调试
# 测试命令执行时间
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)