Linux查看大文件日誌

Linux 查看大日誌文件
1、使用 less 命令

less filename

但是使用上述命令的壞處是,默認打開的位置在第一行,並且當切換到實時滾動模式(按 F ,實現效果類似 tail -f 效果 )或者想要滾動到最底部的時候(按 G ),會卡在計算行數一段時間。如果卡的時間比較長的話,可以直接按 Ctrl + c ,取消計算行數。
我更推薦打開文件的時候使用 -n :不計算行號(打開大文件的時候很有用)。

less  -n file 
less  +G -n   file  // 打開文件的時候,直接定位到文件的最底部,默認情況下是在首行。
less +F -n    file  // 打開文件的時候,使用實時滾動模式,Ctrl + c  退出實時滾動模式,按 F 切回實時滾動模式
less +1000g  -n  file  // 直接定位到第 1000 行,一般你提前通過 grep 命令,定位到行數後,再使用這個命令
less +50p   -n  file  // 直接定位到 50% 的位置
less +50P   -n  file  // 直接定位到第 100 字節的位置。這個命令感覺不怎麼使用。

不使用 -n 的壞處是:當你使用 = 的時候,會計算出當前光標所在的位置,但是務必記得,大文件計算行數會阻塞一段時間。例如執行下列命令:

less copy.log

less 命令打開文件後,按下 = ,因爲文件比較大,卡了我 20 幾秒。

顯示內容爲: 文件名 copy.log , 當前屏幕顯示1-24行/該文件一共有430000070行 , 從第一行到當前位置一共有 144 byte/該文件一共有2580000418 byte , 當前位置在文件的 0% 處。

如果使用 -n,輸入以下命令 :

less -n copy.log

然後按下 = ,執行就非常快了
因此我建議大家使用 less 命令顯示大文件的的時候,加上 -n 。

當然如果文件比較小,你想在使用 less 打開文件,並顯示文件行數的話,可以使用 :

less -N file

如果你已經知道日誌輸出的關鍵字的話,使用 grep , 通常需要打印關鍵字前後的日誌。

grep 'key word' log.txt -A 20 // 列出包括匹配行之後 20 的行。
grep 'key word' log.txt -B 20 // 列出包括匹配行之前 20 的行。
grep 'key word' log.txt -C 20 // 列出包括匹配行前後各 20 行。

大文件的話,grep 出來的數據比較多的話,你可以和 less 一起使用

grep  `world` copy.log | less

有時候需要將 tail 和 less 命令結合起來使用

tail -n +10000 | less // 從第 10000 開始,使用 less 查看。
tail  -n 10000 | less // 查看倒數第 1000 行到文件最後的數據。 

6.切割文件
有時候想把一個大文件進行分割成多個小文件.(我個人是不建議這麼做的,因爲我發現 split 的時候,也是蠻耗時的,但是這裏仍然提供一種解決方法吧)
按文件大小分割:

split -b 600m copy.log

分割後的文件默認是以 x 開頭,例如我上述命令分割後文件爲:

$ ls -lht x*  // 這裏 * 是通配符,即列出以 x 開頭的文件。
-rw-rw-r-- 1 apple apple  61M 6月  22 15:02 xae
-rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xad
-rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xac
-rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xab
-rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xaa

當然你可以按行數分割,具體的命令格式如下 :

split [選項]... [要切割的文件] [輸出文件前綴]  // 輸出文件前綴爲可選項

命令參數    說明
-a, --suffix-length=N    使用長度爲 N 的後綴 (默認 2)
-b, --bytes=SIZE    設置輸出文件的大小。支持單位:m,k
-C, --line-bytes=SIZE    設置輸出文件的最大行數。與 -b 類似,但會盡量維持每行的完整性
-d, --numeric-suffixes    使用數字後綴代替字母
-l, --lines=NUMBER    設備輸出文件的行數
–help    顯示版本信息
–version    輸出版本信息
7.如果你已經知道需要的內容在第幾行,但是想要顯示指定行數之前或者之後的行。例如你想顯示 499999900 到 500000000 這100 行的內容。 推薦使用這個方法

head -500000000 file | tail  -100

其中 head -500000000 : 顯示文件的前 500000000 行。
tail -100 :顯示最後 100行。
兩者結合起來就是在前 500000000 行中顯示後 100 行,即顯示 499999900 到 500000000 這100 行的內容。

或者使用 sed 命令:

sed -n '500000000q;499999900,500000000p'  file

其中 -n 與 p : 表示只打印符合條件的行。
500000000q; : 表示當執行到第 500000000 行的時候停止執行。 如果不使用 500000000q; sed 默認會瀏覽整個文件。
499999900,500000000 : 表示499999900 到 500000000 行。其中 , 逗號表示範圍。
整體結合起來就是打印 499999900 到 500000000 行,但是執行到第 500000000 行就不要再執行了。

或者使用 awk 命令

awk 'NR>=49999991 && NR<=50000000{print} NR==50000001{exit}' file

最後我發現三者的執行效率(copy.log 是一個大小爲 2.5 G 的測試文件):

time (head -500000000  copy.log  | tail -100) > /dev/null
real    0m9.456s
user    0m8.854s
sys    0m3.501s

time (sed -n '500000000q;499999900,500000000p' copy.log) > /dev/null
real    0m25.968s
user    0m25.111s
sys    0m0.833s

time (awk 'NR>=499999900&& NR<=500000000{print} NR==500000001{exit}' copy.log) > /dev/null
real    1m4.743s
user    1m3.824s
sys    0m0.906s

總結
與其說是查看大日誌文件的方法,不如說是將 grep/awk/sed/head/less/tail 多個命令結合起來的方法。

其實最重要的不是怎麼看大文件,還是在程序運行時候,就要對日誌文件進行歸檔整理,例如,每天一次歸檔,或者每滿 500M 就歸檔。
當然大公司會用例如 ELK 之類的日誌處理系統。

提示
如果你在瀏覽這篇文章的時候,苦於沒有大的日誌文件練習, 可以執行如下命令:

seq 1 1000000000 > file

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章