使用sed:
sed -n '3,5p' /etc/passwd
或
sed -n '3,5p;6q' /etc/passwd
(第二个版本会在遇到第 6 行时退出,因此对于大文件会很有效。)
使用awk:
awk 'NR==3,NR==5' /etc/passwd
或
awk 'NR>=3{print}NR==5{exit}' /etc/passwd
(第二个变体在打印第 5 行后退出,因此效率更高。)
使用perl:
perl -ne 'print if $.>=3 and $.<=5;' /etc/passwd
或
perl -ne 'print if $.>=3; last if $.>5' /etc/passwd
(第二个变体同样更有效。)
为了好玩,让我们在 1000 万行的输入上对这些不同的方法进行计时:
$ time seq 10000000 | sed -n '3,5p'
3
4
5
real 0m10.086s
user 0m9.173s
sys 0m0.101s
$ time seq 10000000 | sed -n '3,5p;6q'
3
4
5
real 0m0.012s
user 0m0.010s
sys 0m0.001s
$ time seq 10000000 | awk 'NR==3,NR==5'
3
4
5
real 0m12.906s
user 0m11.475s
sys 0m0.134s
$ time seq 10000000 | awk 'NR>=3{print}NR==5{exit}'
3
4
5
real 0m0.013s
user 0m0.001s
sys 0m0.010s
$ time seq 10000000 | perl -ne 'print if $.>=3 and $.<=5;'
3
4
5
real 0m15.982s
user 0m14.217s
sys 0m0.179s
$ time seq 10000000 | perl -ne 'print if $.>=3; last if $.>5'
3
4
5
6
real 0m0.013s
user 0m0.000s
sys 0m0.011s
很明显,一旦获得所需的行,在大量输入的情况下退出会更有效。不过,在较小的输入上,差异可以忽略不计。