在Linux中打印文件的3,4和5行

pw9*_*w94 0 linux bash shell command-line command

我的Linux命令有问题.我必须把文件/ etc/passwd的输出3,4和5行,但我不知道怎么做.我可以打印前五行:

head -n 5 /etc/passwd
Run Code Online (Sandbox Code Playgroud)

但我不知道如何删除前两行或从头开始.

dev*_*ull 10

使用sed:

sed -n '3,5p' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

要么

sed -n '3,5p;6q' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

(第二个版本会在遇到第6行时退出,因此对于大型文件来说它会很有效.)

使用awk:

awk 'NR==3,NR==5' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

要么

awk 'NR>=3{print}NR==5{exit}' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

(第二个变体在打印第5行后退出,因此效率更高.)

使用perl:

perl -ne 'print if $.>=3 and $.<=5;' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

要么

perl -ne 'print if $.>=3; last if $.>5' /etc/passwd
Run Code Online (Sandbox Code Playgroud)

(第二种变体同样更有效.)


为了好玩,让我们在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
Run Code Online (Sandbox Code Playgroud)

显而易见的是,一旦获得所需的线,在大输入的情况下退出是更有效的.但是,在小投入上,差异可以忽略不计.