1.如果文件比較小的話,使用vim直接查看,如果文件比較大的話,使用vim會直接卡主
2.如果想要查看正在滾動的日志文件.這個命令可以查看大文件.
tail -f file
Ctrl+c 終止tail命令
Ctrl+s 暫停tail命令
Ctrl+q繼續tail命令
3.如果文件比較大的話,也可以使用less命令
less file
但是使用上述命令的壞處是,默認打開的位置是第一行,並且當切換到實時滾動模式(按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
然后按下 = ,執行就非常快了
上述圖片中沒有 lines 數據,所以執行很快。
因此我建議大家使用 less 命令顯示大文件的的時候,加上 -n 。
當然如果文件比較小,你想在使用 less 打開文件,並顯示文件行數的話,可以使用 :
less -N file
4.如果你已經知道日志輸出的關鍵字的話,使用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
5.有時候需要將 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
當然你可以按行數分割,具體的命令格式如下 :
命令參數 | 說明 |
-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