shell --- awk规范 系统总结
文章目錄
- awk和sed的區(qū)別
- awk腳本的流程控制
- awk 記錄和字段
- 字段的引用
- awk表達式
- 賦值操作符
- 算數(shù)操作符
- 系統(tǒng)變量(awk本身自定義的系統(tǒng)變量)
- 關系操作符
- 布爾操作符
- awk 條件和循環(huán)
- 條件語句
- 循環(huán)
- awk 的數(shù)組
- 數(shù)組的定義
- 數(shù)組的遍歷
- 刪除數(shù)組
- 舉例,編寫awk腳本文件`avg.awk`
- 命令行參數(shù)數(shù)組
- 復雜數(shù)組的使用案例
- awk函數(shù)
- 算數(shù)函數(shù)
- 字符串函數(shù)
- 自定義函數(shù)
awk和sed的區(qū)別
- awk更像是腳本語言
- awk用于“比較規(guī)范”的文本處理,用于統(tǒng)計數(shù)量并輸出指定字段
- 使用sed 將不規(guī)范的文本,處理為“比較規(guī)范的文本”
awk腳本的流程控制
- 輸入數(shù)據(jù)前 例程 BEGIN{},相當于預處理,進行變量定義
- 主輸入循環(huán){} ,一般只寫主輸入循環(huán)
- 所有文件讀取完成 例程END{}
awk 記錄和字段
- 每一行稱為 akw記錄
- 使用空格、制表符分隔開的單詞稱為字段
- 可以自己指定分隔的字段
字段的引用
-
awk中使用$1,$2,$3…$n表示每隔字段
awk '{print $1,$2,$3}' filename -
awk 可以使用-F選項改變字段分隔符
awk -F, '{print $1, $2, $3}' filename
分隔符可以使用正則表達式
使用單引號作為分隔符,讀取以menu開頭的字段使用x++,可以打印行號
awk表達式
賦值操作符
=最常使用的操作符(等號前后可以增加空格)var1 = "name"var2 = "hello" "world"賦值多個運算符var3 = $1
- 其他賦值運算符
++ , -- , +=, -=, *=, /=, %=, ^=
算數(shù)操作符
+, -, *, /, %, ^
系統(tǒng)變量(awk本身自定義的系統(tǒng)變量)
-
FS和OFS系統(tǒng)變量,OFS表示輸出的字段分隔符
awk讀取每一行的內容之前,都會先讀取FS和OFS表示的分隔符,輸入時進行字段的提取,輸出時根據(jù)OFS增加分隔符
舉例如下:
head -5 /etc/passwd | awk -F ":" '{print $1}'
使用-F來分隔就等價于
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $1}',通過BEGIN讀入之前,設置好字段分隔符。
增加OFS輸出字段分隔符
-
RS記錄分隔符,行之間的合并
將每一行的記錄分隔符\n設置為:,則每當遇到:,即代表一行
head -5 /etc/passwd | awk 'BEGIN{RS=":"}{print $0}' -
NR和FNR行數(shù)
當輸入為多個文件時,FNR可以重排多個文件,FR則都按照一個文件的行號排列
-
NF字段數(shù)量,最后一個字段內容可以用$NF取出字段內容
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print NF}',輸出每一行的字段個數(shù)
head -5 /etc/passwd | awk 'BEGIN{FS=":"}{print $NF}',輸出最后一個字段的內容
關系操作符
<, >, <=, >=, ==, !=, ~, !~
布爾操作符
&&, ||, !
awk 條件和循環(huán)
條件語句
- 條件語句使用
if開頭,根據(jù)表達式結果判斷執(zhí)行哪一條語句if(表達式)awk 語句1 [elseawk 語句2 ] - 如果有多個語句需要執(zhí)行,可以使用{}將多個語句括起來
循環(huán)
while循環(huán)while (表達式)awk 語句1do循環(huán)do{awk 語句1 }while(表達式)for循環(huán)
使用for進行求和,并取平均值for(初始值;循環(huán)判斷條件;累加)awk 語句1
cat kpi.txt | awk '{sum=0;for(c=2;c<=NF;++c) sum+=$c;print sum/(NF-1)}'- 影響控制的其他語句
break
continue
awk 的數(shù)組
主要為了對awk進行多行關聯(lián),多行之間進行通信
數(shù)組的定義
數(shù)組:一組有某種關聯(lián)的數(shù)據(jù)(變量),通過下標依次訪問
數(shù)組名[下標]=值
下標可以使用數(shù)字,也可以使用字符串。
PS:即使使用的是數(shù)字,awk也會將其當作字符串或者字符來處理
數(shù)組的遍歷
for (變量 in 數(shù)組名)
#使用 數(shù)組名[變量] 的方式依次對每個數(shù)組的元素進行操作
刪除數(shù)組
delete 數(shù)組[下標]
舉例,編寫awk腳本文件avg.awk
awk '{sum=0;\for(c=2;c<=NF;++c)\sum+=$c;\avg[$1]=sum/(NF-1)}\END{\for(user in avg)sum2+=avg[user];print sum2/NR}' \
kpi.txt
加載awk腳本文件
awk -f avg.awk kpi.txt
命令行參數(shù)數(shù)組
命令行參數(shù)數(shù)組:ARGC 參數(shù)個數(shù) 和ARGV代表的參數(shù)內容
主要用來輔助awk的腳本使用
編輯arg.awk
BEGIN{for(x = 0;x < ARGC;x ++)print ARGV[x] #打印每個參數(shù)內容print ARGC #打印參數(shù)個數(shù)
}
執(zhí)行命令awk -f arg.awk 11 22 33
輸出如下:
awk #第0個參數(shù),命令名稱
11
22
33
4 #總共四個參數(shù)(當前命令也會被記錄進去)
復雜數(shù)組的使用案例
編輯result.awk,用來進行總分,平均分、高于且低于平均分人數(shù)統(tǒng)計、分數(shù)評級、各個級別人數(shù)統(tǒng)計,該數(shù)據(jù)記錄在kpi.txt
{
sum = 0
for(c = 2; c <= NF; c++)sum += $cavg[$1] = sum / (NF - 1)if(avg[$1] >= 80) #統(tǒng)計每個人的評級level = "S"
else if(avg[$1] >=70)level = "A"
else if(avg[$1] >= 60)level = "B"
else level = "C"print $1,avg[$1],levelletter_all[level] ++ #關聯(lián)數(shù)組,統(tǒng)計各個評級的人數(shù)
}
END {
for(usr in avg)sum2 += avg[usr]avg_all = sum2 / NR #所有人的平均成績
print "avg_all is :",avg_allfor(usr in avg) #計算超過以及小于平均成績的人數(shù)if(avg[usr] >= avg_all)up++elsedown++print "biger than avg_all",up
print "less than avg_all",downprint "S:",letter_all["S"]
print "A:",letter_all["A"]
print "B:",letter_all["B"]
print "C:",letter_all["C"]
}
運行awk -f result.awk kpi.txt
其中kpi.txt內容如下:
user1 72 56 83 91
user2 55 67 45 89
user3 90 87 85 83
user4 56 57 99 95
user5 55 60 64 32
最終輸出如下:
user1 75.5 A
user2 64 B
user3 86.25 S
user4 76.75 A
user5 52.75 C
avg_all is : 71.05
biger than avg_all 3
less than avg_all 2
S: 1
A: 2
B: 1
C: 1
awk函數(shù)
算數(shù)函數(shù)
sin()和cos()int()
awk 'BEGIN{pi=3.14;print int(pi)}'rand()偽隨機數(shù) 和srand()重新獲取種子 0-1之間
awk 'BEGIN{srand();print rand()}'
字符串函數(shù)
gsub(r,s,t)字符串替換sub(r,s,t)字符串替換substr(r,s,t)字符串替換split(s,a,sep)字符串分割match(s,r)字符串匹配length(s)字符串長度index(s,t)
通過man awk 搜索函數(shù)名稱,可以看到具體函數(shù)的功能以及詳細用法
自定義函數(shù)
函數(shù)定義的位置,寫在 BEGIN ,{},END之外
function 函數(shù)名(參數(shù)){awk 語句return awk 變量
}
舉例如下:
awk 'function a(){ return 0 } BEGIN{print a()}'
awk 'function twice(str) { return str str} BEGIN{print twice("hello awk")}'
總結
以上是生活随笔為你收集整理的shell --- awk规范 系统总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux的 计划任务机制,自己带节奏
- 下一篇: 金桂多少钱啊?