我已经下载了warc文件来自 Ubuntu 18.04 中的 Common Crawl。使用 gzip 解压后,我尝试使用 获取文件的一部分head
。我首先尝试:
head -c 29 CC-MAIN-20210620114611-20210620144611-00436.warc
它产生了预期的结果,输出文件的前 29 个字节:
WARC/1.0
WARC-Type: warcinfo
但是,如果我使用 30 而不是 29,则会产生意想不到的结果:
head -c 30 CC-MAIN-20210620114611-20210620144611-00436.warc
输出:
WARC/1.0
这只是文件的前 10 个字节,而不是前 30 个字节。如果我使用head -c 31
,结果又是预期的。我不知道这是否是一个错误,或者是否存在我不知道的有关 head 工作原理的细节。
答案1
该head
命令几乎肯定会输出请求的字节数,但是这些字节是影响它们在你的终端上的显示方式。
具体来说,您的 gunzipped 文件几乎肯定具有 DOS 样式的 CRLF 行结尾,其中 CR 位于字节 30,LF 位于字节 31。当您执行此操作时head -c29
,head 输出将排除两个行结束字节,并且您会看到类似的内容
yourname@computer:~$ head -c29 file.warc
WARC/1.0
WARC-Type: responseyourname@computer:~$
您的 shell 提示符紧跟在第 29 个字节之后。当您这样做时head -c31
,您会捕获 CR 和 LF,输出如下所示
yourname@computer:~$ head -c31 file.warc
WARC/1.0
WARC-Type: response
yourname@computer:~$
然而当您这样做时head -c30
,输出包含终止 CR 但不包含其后跟的 LF - 光标被送回位置 0,但留在终端的同一行,然后被您的 shell 提示符覆盖:
yourname@computer:~$ head -c31 file.warc
WARC/1.0
yourname@computer:~$
如果行长超过提示符,您将看到文件中的字符超出末尾。如果提示符PS1
为空,那么您将看到完整的预期输出。