情景
cat是linux命令中最为基础的命令之一,它是“concatenate”(连接)的简写,作用概述是concatenate and print files,即:连接和查看文件内容。
常见用法有:
- 查看单个文件:
cat file1
- 顺序查看多个文件:
cat file1 file2 ...
一般cat会结合重定向符号(重写>、追加>>)使用,如常见的用法有:
- 将一个文件的内容追加到另一个文件中:
cat file1 >> file2
- 合并多个文件产生新文件:
cat file1 file2 > newfile
- 用键盘输入创建一个新文件:
cat << EOF > file3
$ cat << EOF > file3
> a
> b
> c
> EOF
>
是命令行的提示符,不是你需要输入的内容。当输入“EOF”按回车后命令自动结束。
$ cat file3
a
b
c
cat命令本身也支持参数,但用法简单,功能单一,感兴趣的话可以自行man cat
。
cat还可以通过管道符“|”连接其它命令,但许多时候cat并不是必需的:
想知道文件的行数,可以使用cat file1 | wc -l
,但wc -l file1
一样可以做到。
想过滤文件中特定的字符串,可以使用cat file2 | grep "some string"
,但grep "some string" file2
一样可以做到。
突破
在搜索引擎项目工作时,看到过研发工程师在调试问题时这样使用了cat——他们启动服务后,使用了命令cat some_data.txt > /dev/null
,虽然当时没有直接向他们请教原委,但这个命令给我留下了深刻的印象:
-
/dev/null
是linux的位桶文件,写入它的内容会永远丢失,从它那里什么也读取不到。一般用法是想丢弃命令产生的标准输出和标准错误时,通常使用command > /dev/null 2>&1
,因此,cat some_data.txt > /dev/null
似乎没有任何效果。 - 当时观察到
cat some_data.txt > /dev/null
这个命令的执行时间非常长,这说明了some_data.txt这个文件也足够大。但第二次执行这个命令时,执行时间则大大缩减了。
由以上大致可以判断出,该用法是为了将文件内容导入到内存中,以便需要使用文件内容时能够快速获取。一般来说,从硬盘中读取数据需要5ms到10ms的时间,而从内存中读取数据时通常只需要50ns到100ns的时间,这就是page cache(页高速缓冲存储器)的作用。
总结
这个经历给我的体会是,许多时候,我们认为自己掌握了全部或绝大部分,而实际上,只是因为自己知道的太少,并且不认为自己知道的太少——我们压根不觉得是因为自己不知道。就像美国前国防部长拉姆斯菲尔德说过的那样:
because as we know, there are known knowns; there are things we know we know. We also know there are known unknowns; that is to say we know there are some things we do not know. But there are also unknown unknowns - the ones we don't know we don't know.
我们有已知的已知,已知的未知,以及未知的未知。
相关链接
https://fulmicoton.com/posts/pagecache/
https://hoytech.com/vmtouch/
https://www.zhihu.com/question/28511196/answer/45604224