sed -n 'START,ENDp' 可高效提取日志指定行号区间,支持 $ 表示末行、分号连接多区间,直接文件操作避免管道,性能优于 head/tail 组合。

用 sed -n 提取日志中指定行号区间,核心是掌握地址范围语法:sed -n 'START,ENDp'。它轻量、无需加载全文,适合处理 GB 级日志文件。
基础语法:精准定位起止行号
sed -n '100,200p' /var/log/syslog 表示只打印第 100 行到第 200 行(含两端)。注意:
- 行号从 1 开始计数;
- 若 END 小于 START(如 '200,100p'),sed 默认不输出任何内容;
- 行号超出文件总行数时,sed 自动截断到末尾行,不会报错。
实用技巧:应对常见边界场景
• 要提取“从第 500 行开始直到结尾”,写成 sed -n '500,$p' /var/log/messages,$ 代表最后一行;
• 想跳过前 N 行只取后续内容,例如跳过头 10 行,等价于 sed -n '11,$p';
• 提取多段不连续区间(如 10–20 和 100–120),需用分号连接:sed -n '10,20p;100,120p';
• 配合 wc -l 快速确认总行数:wc -l /var/log/secure | awk '{print $1}',便于设定合理 END 值。
性能优化:避免管道和冗余操作
• 不要用 cat file | sed -n '100,200p',直接 sed -n '100,200p' file 更高效(减少进程和 pipe 开销);
• 日志过大时,可先用 head -n 200 file | tail -n +100 对比验证结果,但该方式需读取前 200 行,不如 sed -n 直接寻址快;
• 若需同时过滤关键词再取行区间,优先用 awk(如 awk 'NR>=100 && NR),因 sed 行号与模式匹配混合使用较难直观控制。
注意事项:别被空行或编码干扰
• sed 按换行符(\n)计行,二进制乱码或非 UTF-8 编码可能导致行号偏移,建议先用 file -i logfile 查看编码;
• 日志滚动(logrotate)后文件可能被截断或重命名,确保操作的是当前活跃日志路径;
• 若需实时追加提取(如边写边读),配合 tail -f 不适用 sed -n 行号,应改用 tail -n +100 | head -n 101 类方式流式处理。


















