awk 是一種「樣式掃瞄和處理語言」。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表。它的名稱取自於它的創始人 alfred aho、 peter weinberger 和 brian kernighan 姓氏的首個字母。
本文論述的 awk 命令主要指 linux 作業系統中廣泛包含的內建程式 /bin/gawk,它是 unix awk 程式的 gnu 版本。此命令主要負責讀入並執行 awk 語言編寫的程式。在 windows 平台上可以使用 cygwin 在模擬環境下執行 awk 命令。
基本上來說,awk 可以從輸入( 標準輸入,或乙個或多個檔案 )中是否存在指定模式的記錄( 即文字行 )。每次發現匹配時,就執行相關聯的動作( 例如寫入到標準輸出或外部檔案 )。
為了能理解 awk 程式,我們下面概述其基本知識。awk 程式可以由一行或多行文字構成,其中核心部分是包含乙個模式和動作的組合。
pattern模式( pattern ) 用於匹配輸入中的每行文字。對於匹配上的每行文字,awk 都執行對應的 動作( action )。模式和動作之間使用花括號隔開。awk 順序掃瞄每一行文字,並使用 記錄分隔符(一般是換行符)將讀到的每一行作為 記錄,使用 域分隔符( 一般是空格符或製表符 ) 將一行文字分割為多個 域, 每個域分別可以使用 $1, $2, … $n 表示。$1 表示第乙個域,$2 表示第二個域,$n 表示第 n 個域。 $0 表示整個記錄。模式或動作都可以不指定,預設模式的情況下,將匹配所有行。預設動作的情況下,將執行動作 ,即列印整個記錄。
以下面的示例日誌為例:
以此類推……
當我們使用預設的域分割符時,我們可以從日誌中解析出下面不同型別的資訊:
awk '' access.log # ip 位址 (%h)我們不難發現,僅使用預設的域分隔符,不方便解析出請求行、引用頁和瀏覽器型別等其他資訊,因為這些資訊之中包含不確定個數的空格。因此,我們需要把域分隔符修改為 「 ,就能夠輕鬆讀出這些資訊。awk '' access.log # rfc 1413 標識 (%l)
awk '' access.log # 使用者 id (%u)
awk '' access.log # 日期和時間 (%t)
awk '' access _log # uri (%>s)
awk '' access _log # 狀態碼 (%>s)
awk '' access _log # 響應大小 (%b)
awk -f\" '' access.log # 請求行 (%r)注意:這裡為了避免 unix/linux shell 誤解 「 為字串開始,我們使用了反斜槓,轉義了 「 。awk -f\" '' access.log # 引用頁
awk -f\" '' access.log # 瀏覽器
awk -f\" '' access.log | sort | uniq -c | sort -fr此命令列首先解析出瀏覽器域,然後使用管道將輸出作為第乙個 sort 命令的輸入。第乙個 sort 命令主要是為了方便 uniq 命令統計出不同瀏覽器出現的次數。最後乙個 sort 命令將把之前的統計結果倒序排列並輸出。
我們可以使用下面的命令列,統計伺服器返回的狀態碼,發現系統可能存在的問題。
awk '' access.log | sort | uniq -c | sort正常情況下,狀態碼 200 或 30x 應該是出現次數最多的。40x 一般表示客戶端訪問問題。50x 一般表示伺服器端問題。
下面是一些常見的狀態碼:
http 協議狀態碼定義可以參閱:hypertext transfer protocol -- http/1.1
1. 查詢並顯示所有狀態碼為 404 的請求
awk '($9 ~ /404/)' access.log2. 統計所有狀態碼為 404 的請求
awk '($9 ~ /404/)' access.log | awk '' | sort3. 現在我們假設某個請求 ( 例如 : uri: /path/to/notfound ) 產生了大量的 404 錯誤,我們可以通過下面的命令找到這個請求是來自於哪乙個引用頁,和來自於什麼瀏覽器。
awk -f\" '($2 ~ "^get /path/to/notfound ")' access.log系統管理員有時候會發現其他**出於某種原因,在他們的**上使用儲存在自己**上的。如果您想知道究竟是誰未經授權使用自己**上的,我們可以使用下面的命令:
統計共有多少個不同的ip訪問:
awk '' access.log|sort|uniq|wc -log|sort|uniq|wc -l
統計每個ip訪問了多少個頁面
awk ' end ' access.log
將每個ip訪問的頁面數從小到大排序
awk ' end ' access.log | sort -n
檢視某乙個ip訪問哪個頁面
grep ^192.168.1.1 access.log | awk ''
統計2023年02月02日02時內有多少訪問
awk '' access.log | grep 02/feb/2020:02 | awk ''|sort|uniq|wc -l
統計訪問最多的前十個ip位址
awk '' access.log |sort|uniq -c|sort -nr|head -10
列出傳輸大小最大的幾個檔案
cat access.log |awk ''|sort -nr|head -100列出輸出大於 204800 byte ( 200kb) 的頁面以及對應頁面發生次數
cat access.log |awk '($10 > 200000)'|sort -n|uniq -c|sort -nr|head -100如果日誌最後一列記錄的是頁面檔案傳輸時間 (%t),例如我們可以自定義日誌格式為:
logformat "%h %l %u %t \"%r\" %>s %b \"%i\" \"%i\" %t" combined可以使用下面的命令統計出所有響應時間超過 3 秒的日誌記錄。
awk '($nf > 3)' access.log注意:nf 是當前記錄中域的個數。$nf 即最後乙個域。
列出相應時間超過 5 秒的請求
awk '($nf > 5)' access.log | awk -f\" '' |sort -n| uniq -c|sort -nr|head -20**於:
awk工具使用
awk是乙個非常強大的文字報告生成器,用於輸出格式化文字輸出。awk 是由aho,weinberger,kernighan三個人名命名 基本用法 swk options program file program pattern 語句之間用分號分隔 選項 f 指明輸入時用到的字段分隔符 v var v...
AWK工具使用學習筆記(一)
awk 思維 基於模式動作形式,在動作前指定特定的模式,使動作在記錄滿足模式時才執行。基本概念 1 模式和動作 模式 即觸發動作的條件 模式部分決定動作何時觸發及觸發事件。可以是 a 條件語句 if 4 green b 復合語句 and or c 正規表示式 awk 0 gg reen grade....
01 awk工具的使用
一 登入mysql後檢視mysql的連線狀態 show status 回車 如圖所示 threads connected 1 threads running 1 表示幾個程序在工作 倒數第三個 queries 5 二 新建乙個測試資料 vim score.txt name yw sx lisi 66...