![Unix wc 命令中的字符计数](https://linux22.com/image/29259/Unix%20wc%20%E5%91%BD%E4%BB%A4%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E8%AE%A1%E6%95%B0.png)
当我对包含以下内容的文件发出 wc 命令时,它给出的字符数为 30。它是否包括文件结尾字符?由于包括空格和换行符,因此只有 29 个字符。
Hello World
Again Hello World
输出是
2 5 30 test
答案1
Unix 或 Linux 文件系统中没有文件结束符。如果使用的文件描述符引用常规文件,则系统read()
调用在文件结束条件下返回 0。 read()
在套接字和管道上的工作方式不同。您没有获得特殊字符来标记文件结尾。
wc
给你 30 作为字符或字节计数,因为第一行有 12 个字符计算行尾(ASCII 换行符,数字为 0x0a),第二行有 18 个字符,也计算换行符(又名换行符)。
在这种情况下,您可以使用 来仔细检查字符数ls -l
,如果您有hexdump
或xxd
可以获得十六进制打印输出,显示 0x0a 值的换行符。
C 标准库函数fgetc()
确实在文件末尾返回 -1,但这是在库代码中完成的,而不是通过 Unix(或 Linux)或系统read()
调用完成的。
答案2
它是文件中的字节数。请参阅手册页。
这是一个 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
现在添加一个空行:
$ 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