shell-awk高級應用

awk
1、awk簡介
       腳本語言
       變量    .....    流程控制   數組  函數正則表達式

       主要使用awk作數據統計
       1 統計系統內建用戶個數、外建用戶個數 
       2 統計網站服務器 當天的訪問量   access_log
       3 每週一給郵箱使用空間最大的前10個郵箱賬號發提醒郵件
       4 把當前系統10分鐘內cpu使用率最高的前10個進程名輸出
      
      在shell腳本里
           使用awk獲取數據給shell程序處理。
       每5分鐘檢查一下當前系統根分區的使用量,根分區的空閒空間小        於10G時,向當前系統全部終端發送報警信息       
----------------------------------------------------------------------
awk語法格式   (rpm -q   gawk)
awk      '動做'    文件列表 
awk   選項    '條件動做'    文件列表shell

命令  |   awk   選項    '條件動做'數組

---------------------------------------------------------------------
awk 執行過程?
以行爲處理單位,逐行處理文件中的全部行,輸出當前行的處理結果後自動處理下一行,直到把全部行處理完爲止。bash

----------------------------------------------------------------------
選項?
-F  "符號"    指定列的分割符號 awk默認使用空格或\tab做爲列的分隔符
----------------------------------------------------------------------
awk變量的使用 (內置變量   自定義變量     調用shell  )
一、 內置變量服務器

$0  當前讀入的整行文本內容
FNR   保存當前處理行在原文本內的序號(行號)
NR   記錄當前已讀入行的數量(行數)
FILENAME  當前處理文件的文件名
NF    記錄當前處理行的字段個數(列數)域$n    指定分隔的第n個字段,如$一、$3分別表示第一、第3列
FS     保存或設置字段分隔符   空格  \tabide

awk '{print FNR}' a.txt
awk '{print NR,FNR}' a.txt
awk '{print FILENAME}' a.txt  b.txt
head /etc/passwd | awk -F ":" '{print $1}'
head /etc/passwd | awk -F ":" '{print $1,$3}'函數

awk '{print $0}' a.txt
awk '{print "abc"}' a.txt網站

df -h | grep /boot$ | awk '{print $1}'ui

echo  9G | awk -F "[.G]" '{print $1}'
echo  3.5G | awk -F "[.G]" '{print $1}'進程

2 自定義變量
變量名=值
awk '{i=101;name="lucy";print     i,name}' a.txt
awk '{i=101;name="lucy";print 「i,name」}' a000.txt

3 awk調用shell變量
   36  name1=lucy  name2=tom
   37  echo $name1 $name2
   38  awk -v x=$name1 -v y=$name2 '{print x,y}' a.txt

[root@A ~]# x=203
[root@A ~]# awk  '{print '$x' }' a.txt
203
203
203
[root@A ~]#

[root@A ~]# awk -v y=$x '{print  y }' a.txt   調用變量時-v *=$* 
203
203
203
[root@A ~]#

ENVIRON   調用Shell環境變量,格式:ENVIRON["變量名"]
         awk -v y=$HOSTNAME '{print y}' a.txt
  echo $USER   $HOSTNAME
  awk  '{print ENVIRON["USER"]  }' a.txt
 awk  '{print ENVIRON["HOSTNAME"]  }' a.txt
------------------------------------------------------------------
在執行sed命令時,調用shell自定義變量
   45  sed -n '1,3p' a.txt
   46  x=1 y=3
   47  echo $x $y
   49  sed -n ' '$x','$y'p ' a.txt

----------------------------------------------------------------------
awk處理數據的順序?
awk   ''  a.txt
awk   ' {  }  '  a.txt
awk   'BEGIN{  }  {  }  '  a.txt
awk   '{  }  END{  }'  a.txt
awk   'BEGIN{  }  {  }  END{  }'  a.txt

BEGIN{   }  行前處理
                  作數據的初始化定義
   82  awk -F ":" '{print $1}' a.txt
   83  awk 'BEGIN{FS=":"}{print $1}' a.txt

{    }            行處理
                  對每一行執行的命令   多個命令用;間隔

END{   }     行後處理
                  把文件中全部行都處理完後,執行的命令
                  適合作數據的總結行輸出


     71  awk '{print $0}END{print $0}' a.txt
     73  awk 'END{print $0}' /etc/passwd
   74  useradd bob
   75  awk 'END{print $0}' /etc/passwd
      77  awk '{print FNR,$0}' a.txt
   78  awk 'BEGIN{print FNR}{print FNR}END{print FNR}' a.txt

awk 'END{print "文件"FILENAME"的行數是"NR"行"}' /etc/passwd

awk 'BEGIN{FS=":";print "user\tuid\thome"}{print $1"\t",$3"\t",$6}END{print  "sum lines is  "NR}'  a.txt


awk -F ":" '{print $1"\t",$3"\t",$6}END{print  "sum lines is  "NR}'  a.txt   | sed  '1iuser  uid   home'

-------------------------------------------------------------------
awk條件的表示方式?
awk  '{print  $0}'  a.txt
awk  '條件{print  $0}'  a.txt

數值比較
num1   符號   num2
==  等於    != 不等於    
> 大於      >= 大於或等於

< 小於     <= 小於或等於
  975  awk  '{ print $0}'  a.txt
  976  awk  'FNR==5{ print $0}'  a.txt
  977  awk  'NR==5{ print $0}'  a.txt
  978  awk  '1==5{ print $0}'  a.txt
  979  awk  '1==1{ print $0}'  a.txt
  981  awk  'FNR<=3{print $0}'  a.txt
  982  awk  'FNR==3{print $0}'  a.txt
  983  awk  'FNR!=5{print $0}'  a.txt

awk  -F ":"  '$3==500{print $1,$3}'  /etc/passwd

字符串比較
「str1」  符號   「str2」
==  等於    != 不等於

awk  -F ":"  '$1=="rsync"{print $1}'  /etc/passwd
987  awk  -F ":"  '$1=="root"{print $1}'  /etc/passwd
988  awk  -F ":"  '$1!="root"{print $1}'  /etc/passwd

--------------------------------------------------------------------
正則表達式
值   符號    /正則表達式/
      
匹配    ~
不匹配  !~

awk     '$0~/r/{print  $0}'  /etc/passwd
awk -F ":" '$1~/^...$/{print  $1}'  /etc/passwd
awk -F ":" '$1!~/^...$/{print  $1}'  /etc/passwd
------------------------------------------------------------------
邏輯比較 (多個條件)
邏輯與  &&  多個條件同時成立
邏輯或  ||      多個條件有一個條件成立就能夠
邏輯非  !      取反

plj   bob   sync

awk  -F ":" '$1=="plj"  ||  $1=="bob" ||  $1=="sync"{print $1}'  /etc/passwd

awk   -F ":"  '$1=="rsync"   &&  $3<500 {print $1,$3}' /etc/passwd

---------------------------------------------------------------------

運算符
+   -   *   /   %
++
--
+=   -=  *=  /=


輸出文件中的偶數行
awk   'FNR%2==0{print FNR,$0}' a.txt

awk -F ":"  '$3<500{i++}  $3>=500{y++}END{print i,y}'  /etc/passwd

head -1 /etc/passwd  | awk  '{i+=3}END{print i}'
head -3 /etc/passwd  | awk  '{i+=3}END{print i}'
---------------------------------------------------------------------
統計文本的列的總個數
reg.txt
aaa   ff    ccc    3
aaa   ff    ccc   www   4
aaa   ff    ccc   xxx   yyy     ccccc    6
:wq

awk  'BEGIN{i=0} {i+=NF} END{print i}'  reg.txt
---------------------------------------------------------------------
seq  200 | awk  'BEGIN{i=0} $0%3==0 &&
 $0%13==0{print  $0;i++} END{print i}'
--------------------------------------------------------------------
awk流程控制
if 分支結構
單分支  if  (條件表達式){條件成立時執行的命令}
  146  awk -F ":" '{ if($3==0)print $0  }'  /etc/passwd
  147  awk -F ":" '{ if($3==0)print $0;print FNR  }'  /etc/passwd
  148  awk -F ":" '{ if($3==0){print $0;print FNR}  }'  /etc/passwd
  149  awk -F ":" '{ if($3==0){print $0,FNR}  }'  /etc/passwd
  150  awk -F ":" '{ if($3==0){print FNR,$0}  }'  /etc/passwd

awk   -F ":"  '$3==0{print $0,FNR}'  /etc/passwd

雙分支   if  (條件表達式){條件成立時執行的命令}else{}

awk -F ":" '{ if($3==0){print FNR,$0}else{print  $1,$6}  }'  /etc/passwd

多分支 
if(條件1){編輯指令1}else  if(條件){編輯指令2}.. ..
    else{編輯指令N}

awk  -F ":" '{  if($3==0){print $1"  is admin user"}else  if($3>=1&&$3<500){print  $1,$3" inside user"  }else{print  $1,$3"  outside user"}  }'   /etc/passwd

---------------------------------------------------------------------
循環結構  while   do..while    for       

while(條件) { 循環體 }

awk  'BEGIN{    i=1;while( i<=3 ){print  i;i++}   }'

awk  '{    i=1;while( i<=3 ){print  i;i++}    }'   a.txt

awk  '{    i=1;while( i<=3 ){print  $0;i++}    }'   a.txt


awk  -F ":"
 '{  i=1 ;while(i<=NF){ 
if($i~/root/){j++}; i++ }  }  END{print j}' 
/etc/passwd
-------------------------------------------------------------------
do{  循環體  }while(條件)   先執行循環體後判斷條件

awk   'BEGIN{   do{ print i;i++}while(i<=3) }'

[root@A ~]# awk   'BEGIN{   do{ i++;print i}while(i>=3)       }'
1
[root@A ~]# awk 'BEGIN{while(i>=3){i++;print i}}'
[root@A ~]#

----------------------------------------------------------------------
for循環
for(初值;條件;步長){循環體}
awk  'BEGIN{   for (i=1;i<=5;i++){print i}   }'

----------------------------------------------------------------------
循環結構控制語句
break          結束本身所在循環結構的執行
continue     結束本身所在循環結構的本次循環,並開始下一次循環

awk  'BEGIN{   for (i=1;i<=5;i++){print   i;break}   }'

195  awk  'BEGIN{   for (i=1;i<=5;i++){print i;break}}'
  196  awk  'BEGIN{   for (i=1;i<=5;i++){break;print i}}'
  197  awk  'BEGIN{   for (i=1;i<=5;i++){  if(i==3){break};print i}}'
  198  awk  'BEGIN{   for (i=1;i<=5;i++){  if(i==3){countinu};print i}}'
  199  awk  'BEGIN{   for (i=1;i<=5;i++){  if(i==3){continue};print i}}'

控制awk對文件行的處理
next 跳過當前行,讀入下一行文本開始處理
exit 結束文本讀入,轉入END{}執行
                
若是沒有END{}則直接退出awk處理操做

 1003  head /etc/passwd > a.txt
 1004  awk  '{exit}' a.txt
 1005  awk  'FNR==3{exit}{print FNR,$0}' a.txt
 1006  awk  'FNR==3{next}{print FNR,$0}' a.txt
 1007  awk  '{next}{print FNR,$0}' a.txt
 1008  awk  '{print FNR,$0}{next}' a.txt

--------------------------------------------------------------
[root@A ~]# cat c.txt
eth0      Link encap:Ethernet  HWaddr 00:0C:29:B6:48:A6 
encap:Ethernet  HWaddr 00:0C:29:B6:48:A6 
[root@A ~]#
awk      'NF<2{next}   {print  $0 }' c.txt

----------------------------------------------------------------
awk 數組
定義數組
數組名[下標]=值
數組名["下標"]=值
數組名[下標]="值"

awk  'BEGIN{ip[1]="192.168.1.1";ip[2]=101;ip["age"]=29}'

調用數組元素
數組名[下標]

輸出數組元素
print   數組名[下標]


awk  'BEGIN{ip[1]="192.168.1.1";ip[2]=101;ip["age"]=29;print  ip["age"],ip[2],ip[1]}'


awk  'BEGIN{  for (i=1;i<=5;i++){ip[i]="172.16.0."i} ; for (x=1;x<=5;x++){print ip[x]  }  }'

-------------------------------------------------------------------

awk   'BEGIN{  stugrp["s1"]="tom"; stugrp["s2"]="lucy";stugrp["s3"]="bob"; print stugrp["s3"]}'

遍歷數組元素的循環結構
for ( 變量   in   數組名) { 循環體 }

awk   'BEGIN{  stugrp["s1"]="tom"; stugrp["s2"]="lucy";stugrp["s3"]="bob"; stugrp["s4"]="jerry";  for (  plj   in  stugrp) { print   plj ,stugrp[plj]}              }'


head -3 /etc/passwd  | awk -F ":" '{  usergrp[$3]=$1 }END{  for ( x  in  usergrp) { print  x ,usergrp[x] }    }'

 

編寫腳本getupwd-awk.sh,實現如下需求:

1)找到使用bash做登陸Shell的本地用戶
2)列出這些用戶的shadow密碼記錄

3)按每行「用戶名 --> 密碼記錄」保存到getupwd.log

統計a.txt 文件中  每一個用戶名出現的次數[root@A ~]# cat a.txt rootbindaemonrootbinlucylucylucydaemonrootbindaemonrootbindaemon[root@A ~]# ---------------------------------------------------------------------shell基礎 ( bash特性  流程控制  變量  流控函數 執行腳本)                     expect    awk   sed    grep     數組  函數   變量替換  

相關文章
相關標籤/搜索