将文件内容输出到标准输出的命令?

将文件内容输出到标准输出的命令?

我知道cat可以做到这一点,但它的主要目的是连接而不仅仅是显示内容。

我也知道lessmore,但我正在寻找简单的东西(不是寻呼机),它只是将文件的内容输出到终端,并且它是专门为此制作的(如果有这样的东西)。

答案1

最明显的一个是cat。但也看看headtail

还有其他 shell 实用程序可以逐行打印文件:sed,awk,grep。但它们的目的是操纵文件内容或在文件内部进行搜索。

我做了一些测试来估计哪一个是最有效的。我跑遍了低谷strace查看哪个系统调用最少。我的文件有 1275 行。

  • awk:1355系统调用
  • cat:51个系统调用
  • grep:1337系统调用
  • head:93个系统调用
  • tail:130个系统调用
  • sed:1378系统调用

正如您所看到的,即使cat被设计为连接文件,它也是最快、最有效的一种。sedawkgrep逐行打印文件,这就是为什么他们有超过 1275 个系统调用。

答案2

我知道cat可以做到这一点,但其主要目的是连接而不仅仅是显示内容。

的目的cat正是如此,读取文件并输出到stdout。

答案3

首先,cat写入标准输出,该输出不一定是终端,即使是cat作为交互式 shell 命令的一部分键入的。如果即使标准输出被重定向,您确实需要向终端写入一些内容,那也不是那么容易(您需要指定哪个终端,如果从脚本执行命令,甚至可能没有终端),尽管有一个如果该命令只是管道的一部分,则可以(ab)使用标准错误输出。但既然你表示这cat实际上可以完成工作,我想你并不是在问这种情况。

如果您的目的是将写入标准输出的内容发送到管道中,那么 usingcat将符合无用猫奖,因为cat file | pipeline(其中pipeline代表任何管道)可以更有效地完成,因为<file pipeline.但同样,从你的措辞中我推断这不是你的意图。

所以不太清楚你在担心什么。如果您发现cat输入太长,您可以定义一个或两个字符的别名(在标准 Unix 中仍然有一些这样的名称未使用)。然而,如果您担心这cat会浪费无用的周期,那么您就不应该这样做。

如果有一个程序null不带任何参数,只是将标准输入复制到标准输出(管道的中性对象),那么您可以使用<file null.没有这样的程序,尽管它很容易编写(只需一行main函数的 C 程序就可以完成这项工作),但cat不带参数的调用(或者cat -如果您想明确地说)就可以做到这一点。

如果有一个nocat程序只接受一个文件名参数,尝试打开该文件,如果不能打开则抱怨它,否则继续从文件复制到标准输出,那么这正是您所要求的。它只比 编写起来稍微困难一点null,主要工作是打开文件、测试,并可能抱怨(如果你很细心,你可能还想包括一个测试,证明只有一个参数,否则抱怨)。但是cat,现在提供了一个参数,就可以做到这一点,因此不需要任何nocat程序。

一旦你成功地编写了nocat程序,为什么要停在一个参数上呢?将代码包装到循环中for(;*argp!=NULL;++argp)实际上根本不费力,最多向二进制文件添加几个机器指令,并且避免抱怨参数数量错误(这可以节省更多指令)。 Voilà 的原始版本cat,连接文件。 (说实话,你需要稍微调整它,以便在没有参数的情况下它的行为就像null。)

当然,在真正的cat程序中,他们添加了一些花哨的东西,因为他们总是这样做。但本质是,“串联”方面cat实际上根本不需要花费任何精力,无论是对于程序员还是对于执行它的机器来说都是如此。这一事实cat包含nullnocat解释了此类程序的不存在。如果结果进入管道,请避免使用cat单个参数,但如果它仅用于在终端上显示文件内容,即使我链接到的页面也承认这是 的有用用途cat,所以不要犹豫。


您可以测试它cat是否真的通过围绕假设功能的简单循环来实现nocat,通过调用cat多个文件名,其中一个无效名称,而不是在第一个位置:而不是立即抱怨该文件不存在,cat首先转储前面的文件有效的文件,然后抱怨无效的文件(至少我的猫是这样的)。

答案4

我知道这是一个过去时的问题。从技术上讲,由于将文件内容打印到是stdout一种串联形式,cat因此在语义上是合适的。不要忘记这printf在语义上是为了格式化和打印数据。 Bash 还提供了重定向文件输入和输出的语法。这些的组合可能会产生这样的结果:

printf '%s' "$(<file.txt)"

相关内容