三大搜索利器 -- awk

awk 的特色nginx


  文本與數據的處理工具; 可編程: 處理靈活, 功能強大;正則表達式

 

awk 應用編程


 

  • 統計
  • 製表

 

awk 處理方式 與 格式數組


 

awk 處理方式服務器

  • awk 一次處理一行內容;
  • awk 對每行能夠切片處理;
    • awk '{print $1}'         # 打印輸出首個單詞, 默認是空格分割;

 

awk 格式函數

  • 命令行格式
    • awk [options] 'command' file(s)
      • command : pattern {awk操做命令}
      • pattern : 正則表達式, 邏輯判斷式
      • 操做命令可用:
        • 內置函數 : print()  printf()  getline...;
        • 控制指令 : if () {...} else {...}; while () {...};
  • 腳本格式
    • awk -f awk-script-file file(s)

 

awk 內置參數的應用工具


 

  • awk 內置變量 (1)
    • $0 : 表示當前行;
    • $1 : 表示第一個字段;
    • $2 : 表示第二個字段;
    • ... ...
  • awk 內置參數 : 分隔符
    • options : -F field-swparator ( 若不指定的話, 默認使用空格做爲 分隔符 );
    • 示例: awk -F ":" '{print $3}' /etc/passwd            # 以 : 分割, 打印第三個字段;
  • awk 內置變量 (2)
    • NR : 每行的記錄號 ( 每行的行號 );
    • NF : 字段數量變量 ( 字段中字段的種數 );
    • FILENAME: 正在處理的文件名;
  • 使用案例
    • // 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 -- 擴展格式命令行


  •  command 擴展
  • 格式: BEGIN{print "start"} pattern{commands} END {print "end"}
// 製表顯示 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 總結


               

相關文章
相關標籤/搜索