为什么是| wc 在 dir 中输出 3 行,其中包含 3 个单行文件?

为什么是| wc 在 dir 中输出 3 行,其中包含 3 个单行文件?
$ ls
1.txt   2.txt   3.txt
$ ls | wc
       3       3      18

所有三个文件都只有 1 行,但 ls|wc 输出“3”。

答案1

尝试ls | cat看看 ls 在通过管道传输时与发送到终端时的输出格式有何不同。

答案2

ls,当输出到终端以外的任何设备时,其行为类似于ls -1(这是数字1,而不是“ell”)并在新行上输出每个名称。

如果您想计算ls输出中的行数(如果根本没有通过管道传输的话),请使用ls -C。无论输出指向何处,都可以强制执行多列输出-Cls

也就是说,使用

ls -C | wc

或者,为了获取行数,

ls -C | wc -l

另一方面,如果您想分别计算三个文件中的行数,您可以使用

wc -l -- *

如果每个文件只包含一行,这将导致输出

   1 1.txt
   1 2.txt
   1 3.txt
   3 total

即每个文件包含一行,三个文件的总行数为三。

不同之处之间wc -l -- *ls -C | wc -l或者,ls | wc如您所写),是从哪里wc获取输入的。

ls -C | wc -l,wc读取自的输出ls因此会计算命令生成的行数ls。不是任何文件中的行数。

有了wc -l -- *,我们告诉wc阅读特定文件。在这种情况下,文件对应于通配符(“文件名通配模式”)*扩展的名称。

wc -l -- *相当于wc -l -- 1.txt 2.txt 3.txt目录中只有这些文件。

请注意,如果调用当前目录中的文件-,则无法正常工作,因为会将参数wc解释-为含义标准输入。解决这个问题的一种方法是使用wc -l ./*代替(./-对 来说并不特殊wc),但这意味着./前缀也会显示在 的输出中wc

答案3

ls给你 3 列,这与单行不同,因此wc在每列结束后计算新行。换句话说,ls输出格式化文本,即使您看不到。但wc确实如此。

相关内容