溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

7、awk編程語言

發(fā)布時間:2020-07-17 21:00:20 來源:網(wǎng)絡(luò) 閱讀:419 作者:yht_1990 欄目:開發(fā)技術(shù)

awk 獨立的編程語言 (變量 內(nèi)置變量 流程控制 函數(shù) 數(shù)組)

在寫腳本時使用awk獲取數(shù)據(jù)給程序處理

awk獨立使用時,主要用來對數(shù)據(jù)做統(tǒng)計



命令格式

awk [選項] '處理動作' 文件列表 (多個文件之間用空格間隔)


命令 | awk [選項] '處理動作'



awk處理數(shù)據(jù)方式:

以行為處理單位;對數(shù)據(jù)進行逐行處理

處理完當前行 把當前行的處理結(jié)果輸出后自動對一行進行處理 

直到處理完文件中所有行為止


默認是逐行讀入數(shù)據(jù),逐行處理數(shù)據(jù)。要想讓awk只處理指定的行。加條件

只有當前行與條件匹配才執(zhí)行處理動作,反之則不處理



awk [選項]  '條件{處理動作}' 文件列表


條件的表示方式:

1/正則表達式/

2數(shù)值比較

3字符比較

4邏輯比較

選項

-F 指定分割域時的分割符號。默認分割符號是空格和tab健



awk 內(nèi)置變量

$0 保存awk當前讀放行的內(nèi)容

FILENAME 保存awk當前處理文件的文件名

NR  保存awk當前處理的行數(shù)

FNR 保存awk當前處理的行在文件中的行數(shù)

NF 存放用指定分割符號分割后,當前行,列(域)的個數(shù)

$1...$n 表示是用指定的分割符 分割數(shù)據(jù)后的域

$1 變量第1列 $2 第2列

FS 保存字段分割符號 默認值空格和tab健 (FS=

ENVIRON["系統(tǒng)環(huán)境"] (數(shù)組類型)調(diào)用系統(tǒng)環(huán)境變量的值

echo $USER $HOSTNAME

awk '{print ENVIRON["HOSTNAME"]},ENVIRON["USER"]}' a.txt


ENVIRON[“系統(tǒng)環(huán)境變量”] 讓awk調(diào)用系統(tǒng)環(huán)境變量

-v 讓awk使用shell自定義變量


#name=jim

#awk -v mz=$name '{print mz}' a.txt



把awk當前系統(tǒng)已有的用戶名輸出屏幕上  /etc/passwd

awk -F":" '{print NR,$1,$6}' /etc/passwd | head -3


用戶名        家目錄

root/root 

bin/bin

daemon /sbin

共處理 3 行

awk 'BEGIN{FS=":";print "行號\t用戶名\t家目錄"}{print NR"\t",$1"\t",$6}END{print "共處理了"NR"行"}' /etc/passwd


awk處理數(shù)據(jù)順序

BEGIN{ }行前處理:   沒讀入行之前執(zhí)行的動作

      初始化操作都寫在BEGIN{}里


{ }       行處理:     讀入行時執(zhí)行的動作

      對讀放的行做處理


END{  } 行后處理:   行讀完之后執(zhí)行的動作

      做總結(jié)性輸出操作寫在END{}里


每一個處理都可以單獨使用,也可以重復使用,也可以一起使用


head -8 /etc/passwd | awk 'BEGIN{print NR}{PRINT NR}END{print NR}'



條件的表示方式:

1、/正則表達式/

awk ‘/正則表達式/{處理動作}' 文件名

awk '/root/{print NR,$0}'/etc/passwd

awk '/[0-9]/{print $0}' /etc/passwd



~不匹配

!~不匹配

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

awk -F":" '$1!~/a/{print $1,$3}' /etc/passwd


2、數(shù)值比較 == != > >= < <= 

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

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


3、字符比較 ==  !=

awk -F":" '$1!="bin"{print $0}' /etc/passwd

awk -F":" '$1=="root"{print $0}' /etc/passwd


4、邏輯比較(有多個判斷條件時使用) 

&& 邏輯與

|| 邏輯或

! 邏輯非

awk -F":" '$3>=5 && $3<=10{print $1,$3}' /etc/passwd

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



awk運算符號(與shell里的運算符方式相同)

+ - * / % 

+= -= *= /=

++ --


awk里變量的定義與調(diào)用

變量名=值


調(diào)用 變量名


* 也可以不定義直接調(diào)用

awk -F":" 'NR<=3{i=$1;print i}' /etc/passwd


統(tǒng)計內(nèi)建用戶和外建用戶的個數(shù)

awk -F":" 'BEGIN{i=0;j=0}$3>=500{i++}$3<=499{j++}END{print 

"inside user "i" 個";print "outside user "j" 個"}' /etc/passwd



awk 流程控制(流程控制的執(zhí)行過程和shell里流程控制執(zhí)行過程一樣,只是語法格式變了)


一、分支結(jié)構(gòu)

單分支

if(條件表達式)執(zhí)行的操作1

if(條件表達式){條件成立時執(zhí)行的操作1;執(zhí)行操作2;執(zhí)行操作N}


雙分支

if(條件表達式){

動作1;動作2;動作N

else{

動作1;動作2;動作N


awk -F":" '{ if($3<=499){i++}else{j++}}END{print i;print j}' /etc/passwd


多分支

if(條件表達式){

     動作1;動作2;動作N

}

else if(條件表達式){

     動作1;動作2;動作N

......

esle{

     動作1;動作2;動作N


awk -F":" 'BEGIN{x=0;y=0;z=0}{if($3<100){x++}else if

($3>=100&&$3<=499){y++}else if($3>=500){z++}else{print "no user"}}

END{print x,y,z}' /etc/passwd


調(diào)用awk腳本對文件處理

awk -f xxx.awk /etc/passwd


vim xxx.awk

#!/usr/bin/awk -f

BEGIN{

FS=":"

x=0

y=0

z=0

}


{

if($3<=499){

   x++

}else{

   y++

}


END{

print "內(nèi)建用戶個數(shù)是 "x" 個" 

print "外建用戶個數(shù)是 "y" 個"

}


#chmod +x xxx.awk /etc/passwd

./xxx.awk



二、循環(huán)結(jié)構(gòu)

for

for(初值;條件表達式:步長){

條件成立時執(zhí)行的循環(huán)體

}


awk "BEGIN{ for(i=1;i<=10;i++){print i}}"


while 先判斷條件再執(zhí)行循環(huán)體

while(條件表達式){

 條件成立時執(zhí)行循環(huán)體


}


awk -F":" '{while( $3<3 ){print $1,$3;}}' /etc/passwd

awk -F":" '{while( $3<3 ){print $1,$3;$3++}' /etc/passwd

awk -F":" '{while( $3<3 ){print $1,$3;$3=5}}' /etc/passwd


do....while 先執(zhí)行循環(huán)體后判斷條件

do{

  循環(huán)體

}while(條件表達式)


awk 'BEGIN'{i=10:while(i>20){print i;i++}}'

awk 'BEGIN(i=10;do{print i;i--}while(i>20)}'



awk流程控制語句

對awk里的循環(huán)結(jié)構(gòu)做執(zhí)行控制(只要條件成立就執(zhí)行循環(huán)體)

awk數(shù)組


break 結(jié)束當前所在的循環(huán)體

continue 終止本次循環(huán),開始下一次循環(huán)

awk 'BEGIN{for(i=1;i<=10;i++){if(i==4)continue;print i}}'

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


對awk做控制(逐行讀入數(shù)據(jù),逐行處理數(shù)據(jù))

exit

終止awk讀入行


如果有END{}就執(zhí)行END{}里的動作

如果沒有END{}直接結(jié)速處理


awk 'NR==4{exit}{print NR,$0}' a.txt

awk 'NR==4{exit}{print NR,$0}END{print NR}' a.txt


next

讓awk讀取當前行的下一行

awk 'NR==4{next}{print NR,$0}END{print NR}' a.txt



awk數(shù)組

定義數(shù)組格式:數(shù)組名[數(shù)字元素下標]=元素值


*數(shù)組元素的下標可以使用數(shù)字或字符

使用數(shù)組元素格式: 數(shù)組名[數(shù)組元素下標]


輸出數(shù)組元素的值:print  數(shù)組名[數(shù)組元素下標]



awk 'BEGIN'{stuname[0]="jim"stuname[1]="tom";print stuname[0];print stuname[1]}'



awk 'BEGIN{ for{i=0;i<=10;i++}{ num[i]=i;print num[i]} }'

     

awk 'BEGIN{ for(i=0;i<=10;i++){ num[i]=i;print num[2]} }'


awk 'BEGIN{ for(i=0;i<=10;i++){ num[i]=i };print num[2];print num[3] }'



遍歷數(shù)組循環(huán)結(jié)構(gòu)

for(變量名 in 數(shù)組名){print 數(shù)組名[變量名]}



for( x in num ){ print x;print num[x]}


awk 'BEGIN{for(i=0;i<=10;i++)num[i]="user"i};for(w in num){print w,num[w]}'




把系統(tǒng)前5個用戶名存儲到數(shù)組usergrp里,然后輸出數(shù)組usergrp的所有元素

head -5 /etc/passwd | awk -F":" '{print $3,$1}'

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



統(tǒng)計test.txt 文件里每個命令出現(xiàn)的次數(shù)

awk '{comm[$1]++}END{for(x in comm){print x,comm[x]}}' test1.txt | sort -rnk 2


awk '{comm[$1]++}END{for(x in comm){print x,comm[x]}}' ~/.bash_history | sort -rnk 2 | head -10




r 按降序排序

n 按數(shù)字排序

k 按第2列排序



ps -e 顯示系統(tǒng)內(nèi)的所有進程

   -o 指定顯示那列的數(shù)據(jù)

      comm 可執(zhí)行文件名

      cmd | 簡單命令

      pcpu cpu的占用率

      pmem 內(nèi)存使用率

      time 累計的cpu時間

      etime 進程啟動后度過的時間


例子

ps -eo comm,pupu,pmem --sort -pmem | head  按內(nèi)存使用率降序排序

ps -eo comm,pcpu,pmem --sort +pmem | head  按內(nèi)存使用率升序排序




ps -e -o comm,pcpu | tail -n +2




自動連接ssh服務(wù)器腳本

#!/usr/bin/expect

set login_host 192.168.1.1

set login_user root

set login_password 123456

spawn ssh $login_user@login_host

expect "login_user@login_host's password:"

send "$login_password\r"

expect "#"

send "useradd jim9\r"

expect "#"

send "exit"













向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI