头有奇怪的行为

rvb*_*eto 6 command-line coreutils

我已经从 Ubuntu 18.04 中的 Common Crawl下载了一个warc 文件。使用 gzip 解压缩后,我尝试使用head. 我第一次尝试:

head -c 29 CC-MAIN-20210620114611-20210620144611-00436.warc
Run Code Online (Sandbox Code Playgroud)

它产生了预期的结果,输出了文件的前 29 个字节:

WARC/1.0
WARC-Type: warcinfo
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用 30 而不是 29,则会产生我意想不到的结果:

head -c 30 CC-MAIN-20210620114611-20210620144611-00436.warc
Run Code Online (Sandbox Code Playgroud)

输出:

WARC/1.0
Run Code Online (Sandbox Code Playgroud)

这只是文件的前 10 个字节,而不是前 30 个字节。如果我使用head -c 31,结果是预期的再次返回。我不知道这是否是一个错误,或者是否有我不知道的关于头部如何工作的细节。

ste*_*ver 17

head命令几乎肯定会输出请求的字节数,但是这些字节什么会影响它们在终端中的显示方式。

具体来说,您的 gunzipped 文件几乎肯定具有 DOS 样式的 CRLF 行结尾,在字节 30 处为 CR,在字节 31 处为 LF。当您这样做时head -c29,头部输出排除了两个行结尾字节,您会看到类似的内容

yourname@computer:~$ head -c29 file.warc
WARC/1.0
WARC-Type: responseyourname@computer:~$
Run Code Online (Sandbox Code Playgroud)

您的 shell 提示符紧跟在第 29 个字节之后。当你这样做时head -c31,你捕获了 CR 和 LF,输出看起来像

yourname@computer:~$ head -c31 file.warc
WARC/1.0
WARC-Type: response
yourname@computer:~$
Run Code Online (Sandbox Code Playgroud)

但是,当您这样做时head -c30,输出包含终止 CR 但不包含其后面的 LF - 光标被发送回位置 0,但留在终端的同一行上,然后它会被您的 shell 提示覆盖:

yourname@computer:~$ head -c31 file.warc
WARC/1.0
yourname@computer:~$
Run Code Online (Sandbox Code Playgroud)

如果该行比您的提示长,您将看到文件中的字符从末尾向外窥视。如果您的PS1提示为空,那么您将看到完整的预期输出。