情景
cat是linux命令中最為基礎(chǔ)的命令之一,它是“concatenate”(連接)的簡寫,作用概述是concatenate and print files,即:連接和查看文件內(nèi)容。
常見用法有:
- 查看單個文件:
cat file1 - 順序查看多個文件:
cat file1 file2 ...
一般cat會結(jié)合重定向符號(重寫>、追加>>)使用,如常見的用法有:
- 將一個文件的內(nèi)容追加到另一個文件中:
cat file1 >> file2 - 合并多個文件產(chǎn)生新文件:
cat file1 file2 > newfile - 用鍵盤輸入創(chuàng)建一個新文件:
cat << EOF > file3
$ cat << EOF > file3
> a
> b
> c
> EOF
>是命令行的提示符,不是你需要輸入的內(nèi)容。當(dāng)輸入“EOF”按回車后命令自動結(jié)束。
$ cat file3
a
b
c
cat命令本身也支持參數(shù),但用法簡單,功能單一,感興趣的話可以自行man cat。
cat還可以通過管道符“|”連接其它命令,但許多時候cat并不是必需的:
想知道文件的行數(shù),可以使用cat file1 | wc -l,但wc -l file1一樣可以做到。
想過濾文件中特定的字符串,可以使用cat file2 | grep "some string",但grep "some string" file2一樣可以做到。
突破
在搜索引擎項目工作時,看到過研發(fā)工程師在調(diào)試問題時這樣使用了cat——他們啟動服務(wù)后,使用了命令cat some_data.txt > /dev/null,雖然當(dāng)時沒有直接向他們請教原委,但這個命令給我留下了深刻的印象:
-
/dev/null是linux的位桶文件,寫入它的內(nèi)容會永遠(yuǎn)丟失,從它那里什么也讀取不到。一般用法是想丟棄命令產(chǎn)生的標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤時,通常使用command > /dev/null 2>&1,因此,cat some_data.txt > /dev/null似乎沒有任何效果。 - 當(dāng)時觀察到
cat some_data.txt > /dev/null這個命令的執(zhí)行時間非常長,這說明了some_data.txt這個文件也足夠大。但第二次執(zhí)行這個命令時,執(zhí)行時間則大大縮減了。
由以上大致可以判斷出,該用法是為了將文件內(nèi)容導(dǎo)入到內(nèi)存中,以便需要使用文件內(nèi)容時能夠快速獲取。一般來說,從硬盤中讀取數(shù)據(jù)需要5ms到10ms的時間,而從內(nèi)存中讀取數(shù)據(jù)時通常只需要50ns到100ns的時間,這就是page cache(頁高速緩沖存儲器)的作用。
總結(jié)
這個經(jīng)歷給我的體會是,許多時候,我們認(rèn)為自己掌握了全部或絕大部分,而實際上,只是因為自己知道的太少,并且不認(rèn)為自己知道的太少——我們壓根不覺得是因為自己不知道。就像美國前國防部長拉姆斯菲爾德說過的那樣:
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.
我們有已知的已知,已知的未知,以及未知的未知。
相關(guān)鏈接
https://fulmicoton.com/posts/pagecache/
https://hoytech.com/vmtouch/
https://www.zhihu.com/question/28511196/answer/45604224