awk

awk ‘條件 1{動作 1} 條件 2{動作 2}…’ 文件名
條件(Pattern):
一般使用關(guān)系表達(dá)式作為條件。這些關(guān)系表達(dá)式非常多,具體參考表 12-3 所示,例如:
x > 10 判斷變量 x 是否大于 10
x == y 判斷變量 x 是否等于變量 y
A ~ B 判斷字符串 A 中是否包含能匹配 B 表達(dá)式的子字符串
A !~ B 判斷字符串 A 中是否不包含能匹配 B 表達(dá)式的子字符串
動作(Action):
格式化輸出
流程控制語句

執(zhí)行流程

1) 如果有 BEGIN 條件,則先執(zhí)行 BEGIN 定義的動作
2) 如果沒有 BEGIN 條件,則讀入第一行,把第一行的數(shù)據(jù)依次賦予0、1、2 等變量。其中0
代表此行的整體數(shù)據(jù),1 代表第一字段,2 代表第二字段。
2) 依據(jù)條件類型判斷動作是否執(zhí)行。如果條件符合,則執(zhí)行動作,否則讀入下一行數(shù)據(jù)。如果
沒有條件,則每行都執(zhí)行動作。
3) 讀入下一行數(shù)據(jù),重復(fù)執(zhí)行以上步驟

[root@localhost ~]# awk '{printf $2 "\t" $6 "\n"}' student.txt 
#輸出第二列和第六列
begin
[root@localhost ~]# awk 'BEGIN{printf "This is a transcript \n" } 
{printf $2 "\t" $6 "\n"}' student.txt 
#awk 命令只要檢測不到完整的單引號不會執(zhí)行,所以這個命令的換行不用加入“\”,就是一行命令
#這里定義了兩個動作
#第一個動作使用 BEGIN 條件,所以會在讀入文件數(shù)據(jù)前打印“這是一張成績單”(只會執(zhí)行一次)
end
[root@localhost ~]# awk 'END{printf "The End \n" } 
{printf $2 "\t" $6 "\n"}' student.txt
#在輸出結(jié)尾輸入“The End”,這并不是文檔本身的內(nèi)容,而且只會執(zhí)行一次
關(guān)系運算符
[root@localhost ~]# cat student.txt | grep -v Name | \
awk '$6 >= 87 {printf $2 "\n" }'
#使用 cat 輸出文件內(nèi)容,用 grep 取反包含“Name”的行
#判斷第六字段(平均成績)大于等于 87 分的行,如果判斷式成立,則打第六列(學(xué)員名)
包含
[root@localhost ~]# awk '$2 ~ /Sc/ {printf $6 "\n"}' student.txt 
#如果第二字段中輸入包含有“Sc”字符,則打印第六字段數(shù)據(jù)
85.66
正則
[root@localhost ~]# awk '/Liming/ {print}' student.txt 
#打印 Liming 的成績

[root@localhost ~]# df -h | awk '/sda[0-9]/ {printf $1 "\t" $5 "\n"} ' 
#查詢包含有 sda 數(shù)字的行,并打印第一字段和第五字段
指定分隔符
[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" | \
awk 'BEGIN {FS=":"} {printf $1 "\t" $3 "\n"}'
流程控制

在 awk 編程中,因為命令語句非常長,在輸入格式時需要注意以下內(nèi)容:
? 多個條件{動作}可以用空格分割,也可以用回車分割。
? 在一個動作中,如果需要執(zhí)行多個命令,需要用“;”分割,或用回車分割。
? 在 awk 中,變量的賦值與調(diào)用都不需要加入“$”符。
? 條件中判斷兩個值是否相同,請使用“==”,以便和變量賦值進行區(qū)分。

[root@localhost ~]# awk 'NR==2{php1=$3} 
NR==3{php2=$3} 
NR==4{php3=$3;totle=php1+php2+php3;print "totle php is " totle}' student.txt 
#統(tǒng)計 PHP 成績的總分

function 函數(shù)名(參數(shù)列表){
函數(shù)體
}

 awk 'function test(a,b) { printf a "\t" b "\n" }
 { test($2,$6) } ' student.txt

awk 中調(diào)用腳本

[root@localhost ~]# vi pass.awk
BEGIN {FS=":"}
{ print $1 "\t" $3}

awk -f pass.awk /etc/passwd
root 0
bin 1
daemon 2
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容