Unix wc 命令中的字符数

use*_*539 6 text newlines wc

当我对具有以下内容的文件发出 wc 命令时,它给出的字符数为 30。它是否包括文件结尾字符?由于包括空格和换行符,因此只有 29 个字符。

Hello World
Again Hello World
Run Code Online (Sandbox Code Playgroud)

输出是

2  5 30 test
Run Code Online (Sandbox Code Playgroud)

Bru*_*ger 9

在 Unix 或 Linux 文件系统中没有文件结束符。该read()系统调用的档案结尾条件返回0,如果正在使用的文件描述符是指一个普通文件。 read()在套接字和管道上的工作方式不同。您没有特殊字符来标记文件结尾。

wc 给你 30 作为字符或字节数,因为第一行有 12 个字符计算行尾(ASCII 换行符,0x0a 数字),第二行有 18 个字符,也计算换行符(又名换行符)。

在这种情况下,您可以使用 仔细检查字符数ls -l,如果您有hexdump或者xxd您可以获得一个十六进制打印输出,显示 0x0a 值的换行符。

C 标准库函数fgetc()确实在文件结束时返回 -1,但这是在库代码中完成的,而不是由 Unix(或 Linux)或read()系统调用完成的。

  • @ user3539 - Unix/Linux/BSD 文本编辑器的传统/约定是在文件的最后一行末尾放置换行符/换行符,即使您不这样做。如果您使用 vi/vim、ex 或 ed 制作文件,它会为您完成。我不知道所有这些现代的 GUI 编辑器,但我认为他们也这样做。 (3认同)

Tim*_*m B 1

它是文件中的字节数。请参阅手册页。

这是一个 5 字节的示例:

$ echo 1234 > foo.txt
$ od -ta foo.txt
0000000   1   2   3   4  nl
0000005
$ ls -l foo.txt
-rw-r--r-- 1 tim None 5 Feb 27 21:26 foo.txt
$ wc foo.txt
1 1 5 foo.txt
Run Code Online (Sandbox Code Playgroud)

现在添加一个空行:

$ echo >> foo.txt
$ ls -l foo.txt
-rw-r--r-- 1 tim None 6 Feb 27 21:29 foo.txt
$ wc foo.txt
2 1 6 foo.txt
Run Code Online (Sandbox Code Playgroud)