linux - 在 Linux 中打印文件的第 3、4 和 5 行

标签 linux bash shell command-line command

我对 Linux 命令有疑问。我必须将输出放在文件 /etc/passwd 的第 3、4 和 5 行,但我不知道该怎么做。我可以打印前五行:

head -n 5 /etc/passwd

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

最佳答案

使用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

很明显,一旦获得所需的行,在大量输入的情况下退出会更有效率。不过,对于小输入,差异可以忽略不计。

关于linux - 在 Linux 中打印文件的第 3、4 和 5 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22542514/

相关文章:

regex - egrep 字符串大小写

ruby-on-rails - 如何将 Ruby on Rails 网站预编译为生产模式?

linux - 将特定编号的 Bash 文件描述符流式传输到变量中

c++ - 进程内运行线程的名称

shell - 使用 ssh 远程加 grep

linux - 使用 Vagrant 从配置 shell 脚本更新 .bashrc

linux - 如何在 docker 容器内自动启动服务

c - gethostbyname() 或 getnameinfo() 如何在后台工作?

linux - Oracle DB 不接受阿拉伯字符

linux - Bash 脚本在杀死它自己及其所有子进程的 PGID 后没有被杀死