Linux查看大文件日志


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

less filename

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

  1.  
    less  -n file 
  2.  
    less  +G -n   file  // 打開文件的時候,直接定位到文件的最底部,默認情況下是在首行。
  3.  
    less +F -n     file  // 打開文件的時候,使用實時滾動模式,Ctrl + c  退出實時滾動模式,按 F 切回實時滾動模式
  4.  
    less + 1000g  -n  file  // 直接定位到第 1000 行,一般你提前通過 grep 命令,定位到行數后,再使用這個命令
  5.  
    less + 50p   -n  file  // 直接定位到 50% 的位置
  6.  
    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 , 通常需要打印關鍵字前后的日志。

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

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

grep  `world` copy.log | less 

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

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

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

split -b 600m copy.log 

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

  1.  
    $ ls -lht x*  // 這里 * 是通配符,即列出以 x 開頭的文件。
  2.  
    -rw-rw-r-- 1 apple apple  61M 6月  22 15:02 xae
  3.  
    -rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xad
  4.  
    -rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xac
  5.  
    -rw-rw-r-- 1 apple apple 600M 6月  22 15:02 xab
  6.  
    -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 的測試文件):

  1.  
    time (head -500000000  copy.log  | tail -100) > /dev/null
  2.  
    real    0m9.456s
  3.  
    user     0m8.854s
  4.  
    sys     0m3.501s
  5.  
     
  6.  
    time (sed -n '500000000q;499999900,500000000p' copy.log) > /dev/null
  7.  
    real    0m25.968s
  8.  
    user     0m25.111s
  9.  
    sys     0m0.833s
  10.  
     
  11.  
    time (awk 'NR>=499999900&& NR<=500000000{print} NR==500000001{exit}' copy.log) > /dev/null
  12.  
    real    1m4.743s
  13.  
    user     1m3.824s
  14.  
    sys     0m0.906s

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

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

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

seq 1 1000000000 > file


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM