Shell 日志处理:切片与过滤实战
针对"熟悉 shell 基本语法,能对 log 日志返回的数据进行切片及过滤"这一技能点,下面系统梳理核心命令和典型用法。
一、日志切片(按行/字段/时间)
- 按行切片
head / tail
head -n 100 app.log # 前100行
tail -n 100 app.log # 后100行
tail -n +50 app.log # 从第50行开始到末尾
tail -f app.log # 实时跟踪
sed 按行号区间
sed -n '100,200p' app.log # 第100-200行
sed -n '1~10p' app.log # 每10行取一行
awk 按行号条件
awk 'NR>=100 && NR<=200' app.log
awk 'NR%100==0' app.log # 每100行取一行
- 按时间切片
awk 提取指定时间段(日志格式:2024-01-15 10:23:45 ...)
awk '$1" "$2 >= "2024-01-15 10:00:00" && $1" "$2 <= "2024-01-15 11:00:00"' app.log
sed 按时间起止
sed -n '/2024-01-15 10:00:00/,/2024-01-15 11:00:00/p' app.log
- 按字段切片
cut:按字符/分隔符
cut -c1-20 app.log # 前20个字符
cut -d' ' -f1,4 app.log # 空格分隔,取第1、4列
cut -d' ' -f2- app.log # 从第2列到末尾
awk:按字段
awk '{print $1, $4}' app.log
awk -F':' '{print $1}' app.log # 指定分隔符
二、日志过滤
- 行过滤
grep "ERROR" app.log # 包含 ERROR
grep -i "error" app.log # 忽略大小写
grep -v "DEBUG" app.log # 排除 DEBUG
grep -E "ERROR|WARN" app.log # 正则多条件
grep -c "ERROR" app.log # 统计行数
grep -n "ERROR" app.log # 显示行号
grep -A2 -B2 "ERROR" app.log # 上下文各2行 - 字段条件过滤(awk)
第5列状态码 >= 500
awk '$5 >= 500' access.log
某字段等于特定值
awk '$3 == "ERROR"' app.log
多条件组合
awk '$3=="ERROR" && $6>1000' app.log
按字段去重统计
awk '{print $1}' app.log | sort | uniq -c | sort -rn
3. 排除重复/取唯一
sort app.log | uniq # 去重(需先排序)
sort -u app.log # 排序并去重
uniq -c app.log | sort -rn | head # Top N 统计
三、典型组合场景
场景1:统计某时间段内的 ERROR 数量
sed -n '/2024-01-15 10:00/,/2024-01-15 11:00/p' app.log | grep -c "ERROR"
场景2:提取访问日志中响应时间 > 1s 的 URL
awk '$NF > 1.0 {print $7}' access.log
场景3:按小时统计请求量
awk '{print substr($4,2,14)}' access.log | sort | uniq -c
场景4:过滤指定 IP 的 5xx 错误并取前20条
grep "192.168.1.10" access.log | awk '$9 ~ /^5/' | head -20
场景5:实时监控含关键字的新日志
tail -f app.log | grep --line-buffered "Exception"
四、高频命令速查表

五、实战小技巧
--line-buffered:管道中 grep 默认缓冲,实时日志需加此参数。
$NF:awk 中表示最后一列,适合不定长日志。
FNR vs NR:处理多文件时 FNR 是当前文件行号,NR 是总行号。
-o:grep -o 只输出匹配部分,适合提取特定模式。
tac:倒序输出,配合 head 可快速取"最后N条中符合条件的"。

浙公网安备 33010602011771号