截取與分析日誌文件的特定行數的操作

在進行操作系統和數據庫系統管理時經常會遇到在日誌文件中查找某個字符或者按照時間截取某個時間段的日誌進行分析。


今天早上就遇到一個MySQL數據庫上的問題mysql數據庫在0-3點的時候數據庫會話連接tpscpu和iowait等都比平時大了許多。

爲了定位這個時間段內到底發生了那些慢查詢消耗了資源就需要在slow.log慢查詢日誌進行查詢截取和分析。


在處理過程中對幾種常用的日誌截取方法進行了彙總和測試


截取日誌段的的方法彙總與測試

方式一 確定時間段的行號使用head和tail命令截取

搜索時間 Time: 151212 00:00:00  

先到gg到文件最前面然後搜索 /Time: 151212  得到

1979016 # Time: 151212  0:00:15


文件總行數爲

# wc -l slow-query-169-1212.log

1999422 slow-query-169-1212.log

1999422                                 limit 0,20;


然後在到文件最後面G, 搜索4點之後開始的文件  /Time: 151212  4   得到

1987392 # Time: 151212  4:00:05


確定需要查詢的時間段行號後使用head和tail命令進行截取

>>> 1987392 - 1979016;

8376


需要截取的日誌最後行號爲 1979016想用head 命令然後在用tail命令截取最後的 8376 行即可命令爲

head -n 1979016 slow-query-169-1212.log | tail -n 8376   > slow-query-169-1212_00-03.log


方式二 確定時間段的行號使用sed命令截取

截取 151212  0-3點之間的慢查詢日誌

 sed -n '1979016,1987392p' slow-query-169-1212.log  > slow-query-169-1212_00-03.log


>>> 1987392 - 1979016;

8376

該部分文件應該有 8376 行數據確認正常


方式三確定時間段行號後使用awk命令截取

截取 151212  0-3點之間的慢查詢日誌

awk -F"\n" '{if(NR>=1979016&&NR <=1987392)print $0 }' slow-query-169-1212.log  > slow-query-169-1212_00-03.log


方式四不需先確定行號直接用sed取出日誌段

slow log都是以  # Time: 151212  0:00:15 開頭直接用sed 取出其中的日誌

sed -n '/^# Time: 151212  0/,/^# Time: 151212  4/p' slow-query-169-1212.log > part.log    --這樣的效果就和剛纔上面的效果相同取出了0 -3 點之間的數據


如果是想取出 151211 這一天的數據則命令爲

sed -n '/^# Time: 151211/,/^# Time: 151212/p' slow-query-169-1212.log > part.log        --取出了151211 這一天的日誌


注意使用sed 時兩行之間的選擇項一定要對應不然結果就不是想要的結果了

sed -n '/^# Time: 151212/,/^# Time: 151212  4/p' slow-query-169-1212.log > part.log     --前後兩個時間點不同搜索的是全部  # Time: 151212開頭的


使用pt工具對截取的日誌進行分析

分析這段時間的日誌的命令如下

/usr/local/pt/bin/pt-query-digest  /data/bbs/slow-query-169-1212_00-03.log > /data/bbs/slow-query-169-1212_00-03-report.log


這是默認的分析和排序方法可以根據需求選擇其他pt報告分析方法


注1 vim中兩種查詢方式

命令模式下按‘/’然後輸入要查找的字符Enter。和/的區別是一個向前下找一個向後上。

另外‘*’可以查找當前光標下的word完全符合‘g*’則部分符合以#代替*表示向後上找


注2 幾種文件處理方法的簡單舉例

sed是按行處理的不會將整個文件加載到內存中可以放心使用

 要切出從2012-02-09到2012-09-10的所有數據行假設你的日誌文件以yyyy-MM-dd的日期格式開頭只需要

sed -n '/^2012-02-09/,/^2012-09-10/p' whole.log > part.log


無論怎麼樣你都必須使用某一個程序把這個文件讀出來並且用一定的規則來加以過濾。

在Linux中使用cat和grep對文件進行操作已經可以說是最經濟合理的了。

佔用一定的系統資源是肯定的具體的話跟你使用的catgrep以及linux內核都有一定關係所以可能會略有不同。

一般不要在系統裏出現那麼大的日誌文件最好在一開始就做好日誌的大小限制以及合理的日誌轉儲和備份。


顯示文件的第2到第6行

sed -n '2,6p' file


需要加-n參數.

head -n 6 file|tail -n 4


awk 也能達到要求

awk -F"\n" '{if(NR>=2&&NR <=6)print $0 }' file 


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