運維中常需從巨大日志(如 MySQL slow.log)按時間段切片分析。本文總結 head/tail、sed、awk、vim 多種截取方法,並演示 pt-query-digest 深度分析流程。
日志格式:# Time: 151212 0:00:15
# 1. 找起始行 grep -n '^# Time: 151212 0' slow.log | head -1 # → 1979016 # 2. 找結束行(04:00 之後第一行) grep -n '^# Time: 151212 4' slow.log | head -1 # → 1987392 # 3. 截取 head -n 1987392 slow.log | tail -n 8376 > slow_00-04.log
sed -n '1979016,1987392p' slow.log > slow_00-04.log
awk -F'\n' '{if(NR>=1979016 && NR<=1987392) print $0}' slow.log > slow_00-04.log
# 截取 00:00 到 04:00(不含 04:00) sed -n '/^# Time: 151212 0/,/^# Time: 151212 4/p' slow.log > part.log # 截取整天 151211 sed -n '/^# Time: 151211/,/^# Time: 151212/p' slow.log > day.log
注意:起止模式必須唯一匹配,否則會多截取。
/pattern 向下搜,?pattern 向上搜。* 搜尋光標下單詞(整詞),g* 部分匹配。gg 跳首行,G 跳尾行。# 安裝 Percona Toolkit
yum install percona-toolkit -y
# 分析切片日志
pt-query-digest slow_00-04.log > slow_00-04_report.log
# 按響應時間排序 Top 10
pt-query-digest --limit 10 --order-by Query_time:sum slow_00-04.log
# 只分析 SELECT
pt-query-digest --filter '$event->{fingerprint} =~ /^SELECT/' slow_00-04.log
sed/awk 按行流式讀取,不載入全文件內存,安全處理 GB 級日志。cat big.log | grep ... 會雙倍讀取 I/O,直接 grep ... big.log。logrotate 每日切割、壓縮、保留 7-30 天,杜絕單文件過大。grep -n '^# Time:' slow.log > slow.idx,後續按行號秒級切片。#!/bin/bash # usage: extract_slow.sh slow.log "151212 0" "151212 4" out.log LOG=$1; START=$2; END=$3; OUT=$4 sed -n "/^# Time: $START/,/^# Time: $END/p" "$LOG" > "$OUT" echo "Extracted $(wc -l < $OUT) lines to $OUT"