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 數組 函數 變量替換