Linux中檢視日誌檔案的正確姿勢,求你別tail走天下了!
作為一個後端開發工程師,在Linux中檢視檢視檔案內容是基本操作了。尤其是通常要分析日誌檔案排查問題,那麼我們應該如何正確開啟日誌檔案呢?對於筆者這種小菜雞來說,第一反應就是 cat,tail,vi(或vim)了,是的,我曾經用過好多次vim編輯器來檢視日誌檔案。
千萬不要使用vi命令來檢視大檔案內容, 尤其對於那些幾十G的大檔案。因為vi僅僅是一個編輯器(可以理解為windows中的記事本),使用vi命令後則會把檔案所有內容載入到記憶體中,如果記憶體不夠大的話,則可能會導致伺服器癱瘓。
為了生成測試資料,筆者抓心撓肝,東拼西湊,寫了一個生成測試檔案的shell指令碼,方便下文的命令演示,複製到linux命令列執行即可。
# 生成10行測試資料(可根據需求自行修改)
for ((i=1;i <= 10; i++));
do
echo "第$i行" >> test.txt
if [[ `expr $i % 2` -eq 0 ]]
then
echo -e >> test.txt
fi
done
直接檢視檔案內容
檢視整個檔案的內容的命令一共有三個,cat/tac/nl,nl命令筆者用的比較少,所以此處就不再演示了,感興趣的小夥伴可以去百度一哈。
cat [-AbEnTv]
選項與引數:
-A :相當於-vET的整合, 課列出一些特殊字元而不是空白而已
-b :列出行號,進針對非空白行做行號顯示,空白行不會標記
-E :將結尾換行符$顯示出來
-n :打印出行號,連同空白行也會有行號,與-b的選項不同
-T : 將[tab]鍵以^I顯示出來
-v : 列出一些看不出來的特殊字元
範例1:檢視test.txt檔案的內容
cat test.txt
![](http://source.mycookies.cn/202002212119_188.png?ERROR)
範例2:檢視test.txt檔案的內容, 並展示行號
cat -n test.txt
![](http://source.mycookies.cn/202002212203_865.png?ERROR)
範例3: 不推薦使用cat檢視大檔案
cat -n test.txt
![](http://source.mycookies.cn/202002212119_209.gif?ERROR)
cat僅僅適合檢視行數比較少的檔案, 如果檔案比較大則沒有什麼意義了,檔案會快速翻到最後一行。如果檔案中有特殊符號,比如[Tab], 換行等要顯示出來,就必須加上-A之類的選項。當然cat也可以通過管道符配合more或less使用也可以達到比較好的效果。
tac(和cat列印順序相反)
tac學過之後筆者從來沒有實際應用過,由於用的比較少,所以大家知道就行了。不過這個命令比較有意思,和cat拼寫相反,所以他們的列印順序也相反,將最後一行作為第一行輸出。
範例1:倒敘檢視檔案的內容
![](http://source.mycookies.cn/202002212125_329.gif?ERROR)
翻頁檢視
more
more命令瞭解一下就行了,功能太少,筆者一般都用less命令。
按鍵/命令
空格鍵(Space):向下翻頁
回車(Enter):向下翻行
/字串:在當前顯示的內容(翻頁進度位置),向下查詢這個字串關鍵字
:f:立刻顯示檔名以及目前位置的行號
q: :退出當前檔案的瀏覽
b或ctrl+b:往回翻頁
範例1:翻行後,檢視行號
![](http://source.mycookies.cn/202002212126_572.gif?ERROR)
less
less命令比more更加有彈性,可以前後翻頁,不止可以向上查詢,也可以向下查詢。
按鍵/命令
[pagedown] :向下翻頁
[pageup] :向上翻頁
/字串:在當前顯示的內容(翻頁進度位置),向下查詢這個字串關鍵字
?字串:向上查詢字串
n :重複前一個查詢,與/或?有關, 比如前一個命令是?表示向上查詢,此時n會向上查詢
N: 反向的重複前一個查詢
g :跳轉到當前檔案資料的第一行
G :跳轉到當前檔案資料的最後一行
q :退出當前檔案的瀏覽
範例演示
![](http://source.mycookies.cn/202002212126_323.gif?ERROR)
資料擷取
head
head命令用來提取檔案的前n行,一般配合使用-n選項。當指定的行數為負數-x時,則會打印出除了後面x行的其他所有資料。
範例1:檢視前10行資料
![](http://source.mycookies.cn/202002212132_459.png?ERROR)
範例2(一共10000行,沒有空行):head -n -9989 test.txt
![](http://source.mycookies.cn/202002212130_584.png?ERROR)
tail
從檔案尾部擷取資料。tail也是工作中最常用的命令,因為可以利用-f選項,一直重新整理獲取檔案尾部最新資料。
選項與引數
-n : 檢視後n行資料,注意當n後面值帶“+”號表示從第x行開始, 如 tail -n +1000 test.txt
-f : 展示檔案後面
範例1:檢視尾部5行資料【tail -n 5 test.txt】
![](http://source.mycookies.cn/202002212129_251.png?ERROR)
範例2:檢視檔案尾部資料,並實時重新整理資料
![](http://source.mycookies.cn/202002212131_445.gif?ERROR)
範例3:檢視檔案尾部5行資料,並實時重新整理資料
![](http://source.mycookies.cn/202002212130_863.gif?ERROR)
通用命令
管道:Shell 還有一種功能,就是可以將兩個或者多個命令(程式或者程序)連線到一起,把一個命令的輸出作為下一個命令的輸入,以這種方式連線的兩個或者多個命令就形成了管道(pipe),管道命令用"|"來表示。
範例:檢視ll命令輸出的前10行
ll | head -n 3
![](http://source.mycookies.cn/202002212201_844.png?ERROR)
grep : 命令用於查詢檔案裡符合條件的字串,這兩個命令也是linux中最常用的的,而在檢視日誌檔案也通常會結合這兩個命令一起使用。
範例:檢視檔案檔案中那些行包含‘999’
cat -n test.txt | grep '999'
![](http://source.mycookies.cn/202002212147_381.png?ERROR)
>> : 檔案追加重定向命令,可以往檔案末尾追加資料,正如上文 echo "第$i行" >> test.txt
。
範例:將一個檔案的最後10行復制到helloworld.txt中
tail -n 10 >> helloworld.txt
![](http://source.mycookies.cn/202002212155_9.png?ERROR)
wc:檔案位元組數,字數,行數檢視wc [-clw] [檔案...]
,
-c或--bytes或--chars 只顯示Bytes數。
-l或--lines 只顯示行數。
-w或--words 只顯示字數。
範例:檢視檔案行數wc -l
案例實戰
案例1:列印日誌檔案中第11到20行。
思路:首先獲取前20行,然後在獲取20行的後10行即可,需要使用管道命令。head -n 20 text.txt | tail -n 10
![](http://source.mycookies.cn/202002212133_273.png?ERROR)
cat -n test.txt | head -n 20 | tail -n 10
(如果需要行號)
![](http://source.mycookies.cn/202002212134_402.png?ERROR)
總結
Linux的命令實在太多了,對於開發來講要用到的也有很多,不過筆者認為首先要知道是否存在相關命令,然後分類掌握最常用的,需要時再查表即可。沒有必要去糾結命令記不記得住,畢竟這些東西決定不了你的上限。
除了以上命令外,Linux中還有許多檢視日誌檔案內容的奇巧淫記,比如sed命令等,那麼在平時你最常使用的命令有哪些呢?歡迎寫夥伴們留(:
![](http://source.mycookies.cn/202002212337_444.png?ERROR)