【问题标题】:Print 3, 4 and 5 line of the file in Linux在 Linux 中打印文件的第 3、4 和 5 行
【发布时间】:2014-04-27 20:40:29
【问题描述】:

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

head -n 5 /etc/passwd

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

【问题讨论】:

  • 你可以做head -5 /etc/passwd | tail -3

标签: linux bash shell command-line command


【解决方案1】:

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

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

【讨论】:

  • 如果性能至关重要,您可能希望在第 5 行之后退出,但为简单起见,我们假设不是。
  • 是的,退出似乎是对的,但两个版本都+1
  • @tripleee 对;如果文件很大,退出会有所帮助。已更新。
  • awk 'NR==3,NR==5{print} NR==5{exit}'?
  • @kojiro 谢谢。添加了对 1000 万行输入的比较。
【解决方案2】:

使用尾巴:

head -n 5 /etc/passwd | tail -n 3

Tail 返回文件的最后几行以及可以使用这两种功能的管道。

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    相关资源
    最近更新 更多