awk5個使用場景

awk簡介

  1. 首先要知道awk的使用場景,需了解awk有哪些優勢與短板。
  2. 關於個人近期學習awk總結其優勢:
    • awk對文本的處理運算效率同比其他工具效率高很多(比shell的for循環高10倍以上,運算比bc計時器也高很多)
    • awk默認可對多個空格進行列切分,需要再藉助其他工具。
    • awk可以對任意多個字元進行列分隔。
    • 如果文本列很多,可通過NF定位到最後一列獲取列數據。
    • awk工具處理文本的命令非常豐富,幾乎可以看成一套完整的程式語言。
  3. 缺點
    • awk無法修改文本文件。

awk案例

  1. 案例場景:/etc/passwd 第一列、第三列、最後一列

    awk -F":" '{printf "%-20s%-3s%15s\n",$1,$3,$NF}' /etc/passwd
    

    image-20220831225737843

  2. 案例場景:獲取記憶體資訊、IP地址資訊、磁碟分區資訊

    記憶體資訊:

    free -h|awk '/^Mem/{printf"已使用記憶體:%s\n當前空閑記憶體:%s\n記憶體使用率:%.2f%\n",$4,$3,$3/$2*100}'
    

    image-20220831231010598

    IP地址:

    ip address show eth0 |awk -F" +|/" '/inet/{printf"IP地址:%s\n",$3}'
    

    image-20220831232513661

    磁碟資訊:

    df -h|awk -v i=0 -F" +|/" '/\/dev\/(nvm|sdb)/{i++ ;printf"%s.分區名稱:%s\t大小:%s\t已使用:%s\t使用率:%s\n",i,$3,$4,$5,$7}'
    

    image-20220831234456014

  3. 案例場景:做簡單循環,寫一個九九乘法表並統計運行時間,以及比較shell for循環的運算時間

    time(awk 'BEGIN{for(i=1;i<=9;i++){ for(j=1;j<=i;j++){  printf"%s*%s=%s\t",i,j,i*j;if(j==i){printf"\n"}  }}}')
    

    image-20220901000305111

    time(for((i=1;i<=9;i++)) ;do for(( j=1;j<=i;j++)) ;do  echo -en "$i*$j=$((i*j))  " ; if(($i==$j)) ;then echo -e "\n" ;fi   ;done ;done)
    

    image-20220901001431856

  4. 案例場景:做多循環運算再統計運行時間,比較shell for循環運算時間

    time(awk -v num=0 'BEGIN{for(i=1;i<=1000000;i++){  num+=i};print num}')
    

    image-20220901002211304

    time( num=0;for((i=1;i<=1000000;i++)) ;do let num=$((num + i)) ;done ;echo $num)
    

    image-20220901003152164

  5. 案例場景:統計用戶訪問站點IP的個數,以apache日誌為例

    cat /var/log/httpd/access_log-20220828|awk '{ ips[$1]++ }END{for(i in ips){print i,ips[i]}}'
    

    image-20220901010031115