基於awk的nginx日誌分析

2021-09-25 21:21:20 字數 4783 閱讀 2978

在系統調優的時候,經常要去分析nginx的請求日誌,統計、分析各個時間段的請求量。當然分析nginx日誌的方法很多,本文使用awk技術分析日誌。

awk是什麼

awk是乙個強大的文字分析工具,awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。awk語言的最基本功能是在檔案或者字串中基於指定規則瀏覽和抽取資訊,awk抽取資訊後,才能進行其他文字操作。

之所以叫awk是因為其取了三位創始人alfred aho、peter weinberger和barian kernighan的family name的首字母。

在 20 世紀 80 年代中期,對 awk 語言進行了更新,並不同程度地使用一種稱為 nawk (new awk) 的增強版本對其進行了替換。許多系統中仍然存在著舊的 awk 直譯器,但通常將其安裝為 oawk (old awk) 命令,而 nawk 直譯器則安裝為主要的 awk 命令,也可以使用 nawk 命令。dr. kernighan 仍然在對 nawk 進行維護,與 gawk 一樣,它也是開放源**的,並且可以免費獲得(請參見參考資料部分)。

gawk 是 gnuproject 的 awk 直譯器的開放源**實現。儘管早期的gawk 發行版是舊的 awk 的替代程式,但不斷地對其進行了更新,以包含 nawk 的特性。

一般的,awk 始終表示引用通用的語言,而 gawk 或 nawk 實現所特有的特性則使用它們的名稱進行引用。

基本概念

nr(number of record,記錄數,awk中預設一行為乙個記錄)

nf ( number of fileds )是指awk正在處理的記錄包含幾個域(字段),這與域分隔符有關,預設是空白字元(即空格),awk預設以空白字元為分隔符對每一行進行分割。指定使用"#"作為輸入分隔符,比如:awk -f# 『』 test

$0 為獲取全部的列

$n 為第n列

語法

awk -f 『文字切割符』『』 檔名稱

awk、sed、grep比較

grep 更適合單純的查詢或匹配文字

sed 更適合編輯匹配到的文字

awk 更適合格式化文字,對文字進行較複雜格式處理

常見的nginx日誌格式

0.014 api.hudong.com列印第一列

// 列印第一列

cat access.log | awk ''

// 列印所有列

cat access.log | awk ''

// 列印奇數行

awk -

f" "

' nr%2==1' access.log

取第二行第三列的內容
cat access.log | awk 'nr==2 '
匹配,match的使用
// 包含dict請求,相應時間小於0.112s

cat access.log | awk -

f" "

' }'

//或者

cat access.log | awk -

f" "

' match($0,"dict")&&($(nf-1) < 0.112)'

cat access.log | awk -

f" "

' match($0,"dict")&&($(nf-1) < 0.112)&&nr<5'

cat access.log | awk -

f" "

' nr<5&&match($0,"dict")&&($(nf-1) < 0.112)'

awk讀取檔案第5行到第十行內容輸出其中包含關鍵字的行號以及內容
cat access.log | awk '(nr>=5&&nr<=10)'

//或者

cat access.log | awk 'nr==5,nr==10'

awk如何列印從某一列到最後一列的內容
cat access.log |awk -

f" "

'nr==2 '

//或者使用print函式,會換行

cat access.log |awk -

f" "

'nr==12 '

格式化輸出
awk ''     access.log

//30個格、向左對齊的字串

awk 'nr==3' access.log

帶條件篩選
cat access.log   | awk -

f" "

'$(nf-1) > 2 && $(nf-1) <4'

列印總行數

在unix awk中兩個特別的表示式,begin和end,這兩者都可用於pattern中(參考前面的awk語法),提供begin和end的作用是給程式賦予初始狀態和在程式結束之後執行一些掃尾的工作。

awk 'end' access.log

// awk ' begin end ' access.log

awk ' begin end ' access.log

列倒序排
awk  -

f" "

'begin{} else }}' access.log

獲得某個時間段的 行數
grep '2019-07-24t00:00'   access.log | wc -l

//或者

grep '2019-07-24t00:00' access.log | awk -

f 「」 'end'

注:wc -l

統計輸出資訊的行數。更準確的來說,wc -l原本就不是用來檢視行數的,而是用來檢視檔案的newline的數量的。

11.排序

awk -

f" "

'nr==1,nr==20' access.log |sort

//從大到小

awk -

f" "

'nr==1,nr==20' access.log |sort -r

//或者

awk -

f" "

'nr==1,nr==20' access.log

//按照第二列排序

awk -

f" "

'nr==1,nr==20' access.log

//統計ip 並排序

awk -

f" "

'nr==1,nr==200' access.log

根據ip統計請求次數並排序
awk  'end'    access.log 

awk 'end' access.log | sort -rn -k2|head

注:

-r 逆序,從大到小,-n 已數值作比較,可以連寫為-rn;

head 命令表示選取文字的前x行。通過head -5 就可以得到排序結果中前五行的內容。

預設輸出檔案前10行

統計ip請求大於某乙個值的

awk  'end }'    access.log | sort -rn -k2|head

//等價於

awk '' access.log|sort | uniq -c |sort -n -k 1

-r|head

注:

uniq 命令用來過濾重複部分顯示檔案內容,這個命令讀取輸入檔案,並比較相鄰的行

常用: uniq -c 首行顯示檔案**現的次數

使用者請求時間段統計

awk  ' end' 

awk ' end'

awk ' end' access.log

執行函式

$ awk -f functions.awk

//新建乙個functions.awk檔案,內容為:

function

addition

(num1, num2

)begin

Awk分析nginx訪問日誌

awk是linux系統下乙個處理文字的程式語言工具,能用簡短的程式處理標準輸入或檔案 資料排序 計算以及生成報表等等,應用非常廣泛。預設日誌格式 remote addr remote user time local request status body bytes sent http refere...

awk應用日誌分析

需求從日誌裡面統計乙個介面請求耗時 日誌裡面列印的內容是 log.info 請求xx介面code 耗時 日誌分析,直接列印平均數 日誌分析 一開始用的方法 獲取關鍵日誌 包含所需要的字段 grep 耗時 couponcount.txt tmp cc.txt 提取目標列 awk f cc.txt ti...

AWK 日誌分析統計

統計乙個時間範圍內訪 pv 問量 root qfedu.com grep 01 sep 2017 sz.mobiletrain.org.log wc l root qfedu.com awk 4 05 sep 2017 08 00 00 4 05 sep 2017 09 00 00 sz.mobil...