awk 的特色nginx
文本與數據的處理工具; 可編程: 處理靈活, 功能強大;正則表達式
awk 應用編程
awk 處理方式 與 格式數組
awk 處理方式服務器
awk 格式函數
awk 內置參數的應用工具
// awk 打印多個內容; awk -F ":" '{print $1,$3}' passwd // 使用逗號分隔,打印的內容以空格分隔; ... ... tian 502 awk -F ":" '{print $1"------"$3}' passwd // 使用指定的符號進行分隔; ... ... tian------502 awk -F ":" '{print "UserName:"$1" ""UUID:"$3}' passwd // 添加相應內容的說明; ... ... UserName:tian UUID:502 // awk 使用 NR , NF , FILENAME 參數; awk -F ":" '{print NR,NF}' passwd // 使用 NR 打印行號, NF 打印多少個字段; ... ... 27 7 28 7 awk -F ":" '{print FILENAME}' passwd // 每行都打印處理的文件名; ... ... passwd passwd // ****************************** 案例 一 ********************************** ''' 顯示 passwd 每行的行號, 每行的列數, 對應行的用戶名, 使用 print 和 printf() 兩種方法實現 ''' awk -F ":" '{print NR" "NF" "$1}' passwd // 使用 print; ... ... 27 7 zxjr 28 7 tian awk -F ":" '{printf("%2s %s %s\n",NR,NF,$1)}' passwd // 使用 printf() 函數; ... ... // 2 表示佔用的字符數, 使打印更整齊; 27 7 zxjr 28 7 tian // ******************************* 案例 二 ********************************** ''' 顯示 passwd 中用戶 ID 大於100 的行號和用戶名 (使用 if ... else ...)''' awk -F ":" '{if ($3>100) print NR" "$1}' passwd ... ... 27 zxjr 28 tian // ******************************* 案例 三 ********************************** ''' 在服務器 log 中找出 'Error' 的發生日期''' sed -n '/Error/p' /var/log/messages |awk '{print $1,$2,$3}' // 方法一; awk '/Error/ {print $1,$2,$3}' /var/log/messages // 方法二;
awk 邏輯判斷spa
// 匹配 $1 是以 t 開頭的行; awk -F ":" '$1~/^t.*/ {print $1}' passwd tian // 匹配 $1 不以 t 開頭的行; awk -F ":" '$1!~/^t.*/ {print $1}' passwd root ... ... // 判斷 UUID 大於 500 的輸出用戶名; awk -F ":" '$3>500 {print $1}' passwd zxjr tian // 判斷 UUID 等於 502 的輸出用戶名; awk -F ":" '$3==502 {print $1}' passwd tian
awk -- 擴展格式命令行
// 製表顯示 passwd 每行的行號, 每行的列數, 對應行的用戶名 awk -F ":" 'BEGIN{print "Line Col User"}{print NR" "NF" "$1}END{print "------"FILENAME"------"}' passwd Line Col User 1 7 root 2 7 bin ... ... 10 7 uucp ... ... ------passwd------ // 比較美觀的寫法; awk -F ":" 'BEGIN{print "Line Col User"}{printf("%2s%10s%s%s\n",NR,NF," ",$1)}END{print "------"FILENAME"------"}' passwd ... ... Line Col User 1 7 root 2 7 bin ... ... 10 7 uucp ... ... ------passwd------
awk -- 案例code
// ***************************** 案例 一 ******************************** ''' 統計當前文件夾下的 文件/文件夾 佔用的大小 ''' // 定義 size 變量, size 累加文件及目錄的大小, 打印總和; ls -l |awk 'BEGIN{size=0}{size+=$5}END{print " Size is: "size}' Size is: 1024038984 // 添加單位, 進行換算; ls -l |awk 'BEGIN{size=0} {size+=$5} END{print " Size is: "size/1024"M"}' Size is: 1.00004e+06M // ***************************** 案例 二 ******************************** ''' 統計顯示 passwd 的帳戶總人數 ( 要考慮空行的可能 ) ''' // 開始, 定義計數器, 匹配排除空行, 自加一, 結束, 打印總數; awk 'BEGIN{count=0} $1!~/^$/{count++} END{print " Totle: "count}' passwd Totle: 28 // ***************************** 案例 三 ******************************** ''' 統計顯示 passwd 文件中 UUID 大於 100 的用戶 ''' // 定義計數器, 判斷 UUID 大於 100; 定義一個數組, 將值與用戶對應, 使用 for 循環打印用戶名; awk -F ":" 'BEGIN{count=0} {if ($3>100) name[count++]=$1} END{for (i=0;i<count;i++) print i,name[i]}' passwd 0 abrt 1 saslauth 2 nginx 3 zxjr 4 tian // ****************************** 案例 四 ******************************** ''' 統計 netstat -anp 狀態下爲 LISTEN 和 CONNECTED 的鏈接數量 ''' // 定義計數器, 判斷狀態行等於兩種狀態時, 計數器自加一, 打印總數; netstat -anp |awk 'BEGIN{count=0} {if ($6=="LISTEN"||$6=="CONNECTED") count++} END{print " Connect Totle: "count}' Connect Totle: 68 // 狀態行匹配兩種狀態的其中一種,匹配到哪一種, 哪一種自加一, 使用 for 循環打印; netstat -anp |awk '$6~/CONNECTED|LISTEN/ {sum[$6]++} END{for (i in sum) print " ",i,sum[i]}' CONNECTED 64 LISTEN 4
awk 總結