1. 程式人生 > >大日誌分割的幾種方法

大日誌分割的幾種方法

當日志容量上G的時候,用vi檢視具體內容效率就會變得特別低,這個時候就需要將大日誌進行分割。
為了比較各種分割方法的效果,我選取的測試日誌基本資訊如下:

# ls -lrth test.log
-rw-r--r-- 1 root root 645M 530 20:42 test.log
# wc -l test.log
8856340 test.log
  
  • 1
  • 2
  • 3
  • 4

1. split方法分割

split命令專門用來將一個大檔案分割成很多個小檔案,我把split命令的選項做一個簡要說明

選項 含義
-b 分割後的文件大小,單位是byte
-C 分割後的文件,單行最大byte數
-d 使用數字作為字尾,同時使用-a length指定字尾長度
-l 分割後文檔的行數

為了儘量保證日誌的可讀性,我們按行分割大日誌檔案,並且指定分割後的檔案的字首和字尾

#字尾是數字,佔兩位,字首是test.log
split -l 1000000 test.log -d -a 2 test.log
#分割之後的結果
ls -lrth 總用量 1.3G -rw-r--r-- 1 root root 645M 5月 30 20:42 test.log -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log00 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log01 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log02 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log03 -rw-r--r-- 1 root root 73M 5月 30 20:55
test.log04 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log05 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log06 -rw-r--r-- 1 root root 73M 5月 30 20:55 test.log07 -rw-r--r-- 1 root root 64M 5月 30 20:55 test.log08
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2. dd分割

dd bs=1M count=300 if=test.log of=newlog.1
dd bs=1M count=300 if=test.log of=newlog.2 skip=300
dd bs=1M count=300 if=test.log of=newlog.3 skip=600
  
  • 1
  • 2
  • 3

分割後的效果

ls -lrth
總用量 1.3G
-rw-r--r-- 1 root root 645M 530 20:42 test.log
-rw-r--r-- 1 root root 300M 530 21:07 newlog.1
-rw-r--r-- 1 root root 300M 530 21:07 newlog.2
-rw-r--r-- 1 root root  45M 530 21:07 newlog.3
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在上面使用的命令中,bs代表資料塊的大小,count表示複製的塊數,if表示輸入檔案,of表示輸出檔案。
這個命令不能一下就把檔案分割到我們想要的狀態,而且很有可能一行日誌被分到兩個檔案中。

3. head+tail分割

用這兩個命令獲取檔案部分內容,然後重定向就能實現檔案分割,但是限制也挺多,只能把檔案分成兩部分,如果檔案特別大,想要達到預期的效果,就要一直分割下去。
head/tail -n $行數 test.log > newlog
因為這兩個命令都比較熟悉,不再多講。

4. sed實現分割

實現原理就是用sed擷取特定行之間的內容,然後進行重定向。

sed -n '1,2000000p' test.log > test.log.1
sed -n '2000001,4000000p' test.log > test.log.2
sed -n '4000001,6000000p' test.log > test.log.3
sed -n '6000001,8000000p' test.log > test.log.4
sed -n '8000001,$p' test.log > test.log.5
  
  • 1
  • 2
  • 3
  • 4
  • 5

$表示最後一行,這個如果分割過多,也需要一個迴圈。

5. awk實現分割

實現原理和sed差不多,因為使用awk不多,這裡只舉一個小例子:

awk ‘{if (NR<120000) print $0}’ test.log > a.txt
awk ‘{if (NR>=120000) print $0}’ test.log > b.txt
  
  • 1
  • 2

還是split用得舒服。

參考部落格:http://blog.csdn.net/wind0513/article/details/5871293

來源:https://blog.csdn.net/u012949658/article/details/72812236