发布于2026-05-28 阅读(0)
扫一扫,手机访问
提取文件中特定范围的行,是日常文本处理里再常见不过的需求。比如,想快速查看日志文件的第5到第10行,或者只检查配置文件的某一段。方法有好几种,但选对工具,用对语法,效率和结果大不相同。

说到提取连续行,sed -n '5,10p' 绝对是首选。它的逻辑非常直观:从第5行开始打印,到第10行结束。关键在于 -n 选项,它告诉 sed 默认不输出任何内容,只有匹配到 p 命令的行才打印。这种方式是流式处理,不会把整个文件加载到内存,对于动辄几个G的大日志文件非常友好。
不过,这个命令虽然简单,却有几个高频“翻车点”:
-n:如果忘了加 -n,sed 会先把整个文件原样输出一遍,然后再额外打印你指定的5到10行,结果就是屏幕上一片混乱的重复内容。'5-10p' 或者 '5~10p' 都会导致语法错误,sed 根本不认识这些符号。'5,10 p' 里,逗号和 p 之间多了一个空格,这会被 sed 解析为无效指令,直接报错 invalid command code。它的典型应用场景包括:
sed -n '1,20p' error.log 看最新的20条错误。sed -n '100,200p' access.log | grep '404',效率比直接在整个文件里 grep 要高。如果需求稍微复杂一点,比如“从第一个包含 ERROR 的行开始,往后取5行”,或者需要基于行号做更复杂的判断,awk 的优势就体现出来了。它的基本形式 awk 'NR>=5 && NR<=10' 和上面的 sed 命令效果一样,但语法更接近编程思维,扩展性更强。
这里有几个关键点需要注意:
NR 变量:代表“已读的总记录数”,也就是行号,从1开始。它是 awk 的内置变量,非常方便。awk '...' a.txt b.txt 同时处理多个文件时,NR 会一直累加下去。如果你希望行号针对每个文件重新计数,应该使用 FNR 变量。awk 在行号处理上的一些巧妙用法:
awk 'NR>10' file 比 sed -n '11,$p' 更直观易读。awk 'NR%2==1' 取奇数行,awk 'NR%2==0' 取偶数行。用 sed 来实现同样的功能,语法会繁琐得多。有时候只需要看单独一行,比如第2行。这时最优雅的方式是 sed -n '2p'。实测在十万行的文件上,这个命令的耗时可以忽略不计(约0.003秒)。虽然写成 sed -n '2,2p' 也能达到目的,但多了一次范围解析,显得不够简洁。
提取单行时也有一些细节:
sed -n '2p' file 和 awk 'NR==2' file 都不会报错,只是没有任何输出。这符合预期,不是 bug。head -n 2 file | tail -n 1 来取第2行。这个方法虽然直观,但启动了两个进程(head 和 tail),并且 head 命令会先读取前两行,效率上不如单命令的 sed 或 awk。这是一个非常隐蔽的坑。如果一个文件的最后一行没有以换行符(\n)结尾,它就不符合 POSIX 标准中“完整行”的定义。这时,不同工具的行为可能不一致:
sed -n '$p' 通常能正确打印出最后一行,无论末尾有没有换行符。awk 'END{print}' 或类似逻辑取不到最后一行。如何判断文件是否有这个问题?一个简单的方法是交叉验证:用 wc -l file 统计的行数,和用 sed -n '$=' file 得到的行数进行对比。如果两者不一致,很可能就是最后一行缺少换行符。
这个问题在处理由某些程序自动生成的日志、或者中途被截断的临时文件时特别容易出现。明明感觉数据少了一行,查了半天才发现是文件格式的“锅”。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9