换行符 (-l) 的字数统计如何工作?换行数或行数

Jie*_*eng 6 wc

我想知道如何wc工作?大多数时候它似乎返回行数,但有时它似乎是换行符?在手册页中它的换行符。但:

[jiewmeng@JM textFiles]$ echo -e "\n\n" | wc -
      3       0       3 -
Run Code Online (Sandbox Code Playgroud)

如果上面返回换行符的数量,它应该只返回 2?我也得到了这个奇怪的文件:

[jiewmeng@JM textFiles]$ cat testA.txt 
The quick
brown fox
jumped over
the lazy 
dog.[jiewmeng@JM textFiles]$ wc testA.txt 
 4  9 50 testA.txt
Run Code Online (Sandbox Code Playgroud)

在上述情况下,它似乎返回了换行符的数量?

X T*_*ian 13

在您的第一个示例中,echo 将在末尾添加它的换行符,您可以通过将 -n 选项添加到 echo 来停止此操作。

wc 计算字符、单词和行数,行被定义为零个或多个以换行符 ( \n)结尾的字符。


Sté*_*las 12

3来到这里的原因已经解释过了,但要补充一点关于主题中的问题:

根据该术语的严格 (POSIX) 定义,文本行始终以换行符结尾,因此计算换行符的数量与计算行数相同。

但有时,您会发现文件在最后一个换行符之后有数据(通常,非文本文件最有可能这样做)。例如,printf foo(与实现相同echo -n fooecho 'foo\c'取决于echo实现)的输出不包含任何行,因为它foo没有以换行符终止。

文本工具(该行为wc不是一个文本实用程序)是不确定的POSIX在这种情况下(一个文件,在比换行符以外的字符结尾不是一个文本文件)。有一些实用程序实现会将这些额外的字符视为额外的行,有些会忽略它们,有些可能会发出警告消息。在将其视为额外行的那些中,有些会在输出中添加缺少的换行符,有些则不会。

这意味着它wc -l不一定会给您与sed -n '$='orawk 'END{print NR}'或 or 之类的结果相同的结果grep -c '^'


ter*_*don 8

你的假设是正确的。wc -l计算换行符 ( \n)的数量。正如 XTian 所说,echo在它打印的所有内容的末尾添加一个换行符,除非您告诉它不要-n使用某些实现或通过包含\c其他一些实现(符合 Unix 的实现)。

您可以通过管道检查这是否是正在发生的事情od -c

$ echo -e '\n\n' | od -c
0000000  \n  \n  \n
0000003
Run Code Online (Sandbox Code Playgroud)

所以wc -l正确计算三行。