sed(Stream Editor)是Linux中强大的文本处理工具,特别适合日志文件的快速分析和处理。下面介绍几种常见的日志处理场景和使用方法。
# 查看第10-20行
sed -n '10,20p' logfile.log
# 查看从匹配"ERROR"的行开始到文件末尾
sed -n '/ERROR/,$p' logfile.log
# 显示包含"ERROR"的行
sed -n '/ERROR/p' logfile.log
# 显示不包含"DEBUG"的行
sed '/DEBUG/d' logfile.log
# 假设日志格式为 "DATE LEVEL MESSAGE",提取日期和消息
sed -n 's/^\([^ ]*\) [^ ]* \(.*\)$/\1 \2/p' logfile.log
# 提取JSON日志中的特定字段
sed -n 's/.*"user":"\([^"]*\)".*/\1/p' logfile.json
# 提取2023-05-01 10:00到11:00之间的日志
sed -n '/2023-05-01 10:00:/,/2023-05-01 11:00:/p' logfile.log
# 替换所有"ERROR"为"CRITICAL"
sed 's/ERROR/CRITICAL/g' logfile.log
# 在每行开头添加时间戳
sed 's/^/$(date "+%Y-%m-%d %H:%M:%S") /' logfile.log
sed -n '/ERROR/p' logfile.log | wc -l
# 显示错误行及其前后2行
sed -n '/ERROR/{x;N;N;x;p;}' logfile.log
# 删除空行和注释行
sed -e '/^$/d' -e '/^#/d' logfile.log
# 提取访问量最高的10个IP
sed -n 's/^\([0-9.]*\).*/\1/p' access.log | sort | uniq -c | sort -nr | head -10
# 统计HTTP状态码
sed -n 's/.*HTTP\/1.[01]" \([0-9]\{3\}\).*/\1/p' access.log | sort | uniq -c
# 将多行堆栈跟踪合并为单行(假设以日期开头的行是新日志条目)
sed ':a;N;$!ba;s/\n\t/ /g' multiline.log
-n
选项配合p
命令可以显著提高性能grep
过滤再用sed
处理sed的强大之处在于它可以与管道和其他命令组合使用,构建复杂的日志处理流程。