头,尾,然后线?

phs*_*phs 10 text-processing

从文件中提取由其编号给出的行的最简单方法是什么。例如,我想要 . 的第 666 行somefile。您将如何在终端或 shell 脚本中执行此操作?

我可以看到像head -n 666 somefile | tail -n 1,甚至是一半不正确的解决方案cat -n somefile | grep -F 666,但必须有更好、更快、更强大的解决方案。也许使用更晦涩的 unix 命令/实用程序?

dr_*_*dr_ 23

seds编辑器)是这种工作的正确工具:

sed -n '666p' somefile

编辑:@tachomi 的解决方案sed '666q;d' somefile在处理大型文本文件时更好,因为它在打印模式后退出sed而不读取文件的其余部分。在所有其他文件上,差异无关紧要。


tac*_*omi 18

您可以使用 sed

sed -n '666p' somefile
Run Code Online (Sandbox Code Playgroud)

或者

sed '666!d' somefile
Run Code Online (Sandbox Code Playgroud)

或者在大文件中

sed '666q;d' somefile 
Run Code Online (Sandbox Code Playgroud)

在 bash 脚本中

#!/usr/bin/bash
line=666
sed "$line"'q;d' somefile
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 7

POSIXly(也许是大文件最快的):

tail -n +666 | head -n1
Run Code Online (Sandbox Code Playgroud)

  • @dr01:运行你的 `sed` 并用文件挖掘一个巨大的文件,你可以看到不同的。你的甚至比 tachomy 更糟糕,因为你阅读了文件的其余部分,而不是在点击线路后退出。阅读 [this](http://unix.stackexchange.com/questions/47407/cat-line-x-to-line-y-on-a-huge-file) 了解更多详情。 (3认同)

Arc*_*mar 6

尝试

awk 'NR == 666 { print ; exit ; } '
Run Code Online (Sandbox Code Playgroud)

或者

awk -vline=$LINE 'NR == line { print ;  exit ; } ' 
awk 'NR == '$LINE' { print ; exit ;  } '
Run Code Online (Sandbox Code Playgroud)

如果您想通过 shell 变量 ($LINE) 提供行号。

e[dx]it:根据 terdon 的建议。