为什么在 Unix 中使用“tail -n 1”来查找文件的第 n 行?

-1 linux command-line shell

我注意到人们通常使用head -n | tail -n 1Shell 来查找文件的第 n 行。

例如,如果我被要求查找文件的第 7 行,为什么不直接使用head -7而不是使用 来创建管道tail

Sté*_*las 5

head -7
Run Code Online (Sandbox Code Playgroud)

或其现代和标准的等价物:

head -n 7
Run Code Online (Sandbox Code Playgroud)

打印输入的前 7 行(如果较少,则最多打印 7 行)。

通过管道将其从tail -n 1其中取出最后一行,因此仅第 7或最后一行(如果行数较少)。

要仅获取第 7(如果行数较少,则什么也得不到),您可以使用:

tail -n +7 | head -n 1
Run Code Online (Sandbox Code Playgroud)

对于较大的值或行号来说,由于通过管道的数据较少,因此效率也会更高。

您也可以通过一个sed命令来完成此操作:

sed '7!d;q'
Run Code Online (Sandbox Code Playgroud)

尽管这可能效率较低,因为sed它不像 和 那样专业化headtail并且与/sed相反,不需要能够处理比这更长的行,具体取决于实现可能无法在过长的行上工作。headtailLINE_MAX

请注意,sed -n 7p或按照注释中的建议,即使在打印第7sed '7!d'行后也要读取整个输入,而不是像那样停止阅读。这效率较低,但在某些情况下,例如当应用于命令的输出时,我们不想在输出第 7 行后终止该命令,这可能更可取head