国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
[轉(zhuǎn)帖]Linux\awk 簡(jiǎn)明教程
摘錄自《《LINUX與UNIX SHELL編程指南》讀書筆記》(zqf620)

AWK介紹
0.awk有3個(gè)不同版本: awk、nawk和gawk,未作特別說明,一般指gawk。
1.awk語(yǔ)言的最基本功能是在文件或字符串中基于指定規(guī)則來(lái)分解抽取信息,也可以基于指定的規(guī)則來(lái)輸出數(shù)據(jù)。完整的awk腳本通常用來(lái)格式化文本文件中的信息。

2.三種方式調(diào)用awk
1) awk [opion] 'awk_script' input_file1 [input_file2 ...]
awk的常用選項(xiàng)option有;
① -F fs : 使用fs作為輸入記錄的字段分隔符,如果省略該選項(xiàng),wak使用環(huán)境變量IFS的值
② -f filename : 從文件filename中讀取awk_script
③ -v var=value : 為awk_script設(shè)置變量
2) 將awk_script放入腳本文件并以 #!/bin/awk -f 作為首行,給予該腳本可執(zhí)行權(quán)限,然后在shell下通過鍵入該腳本的腳本名調(diào)用之。
3) 將所有的awk_script插入一個(gè)單獨(dú)腳本文件,然后調(diào)用: awk -f wak腳本文件 input_file(s)

3. awk的運(yùn)行過程
1) awk_script的組成:
① awk_script可以由一條或多條awk_cmd組成,兩條awk_cmd之間一般以NEWLINE分隔
② awk_cmd由兩部分組成: awk_pattern { actions }
③ awk_script可以被分成多行書寫,必須確保整個(gè)awk_script被單引號(hào)括起來(lái)。
2) awk命令的一般形式:
awk ' BEGIN { actions }
awk_pattern1 { actions }
............
awk_patternN { actions }
END { actions }
' inputfile
其中 BEGIN { actions } 和 END { actions } 是可選的。
3) awk的運(yùn)行過程:
① 如果BEGIN 區(qū)塊存在,awk執(zhí)行它指定的actions。
② awk從輸入文件中讀取一行,稱為一條輸入記錄。(如果輸入文件省略,將從標(biāo)準(zhǔn)輸入讀取)
③ awk將讀入的記錄分割成字段,將第1個(gè)字段放入變量$1中,第2個(gè)字段放入$2,以此類推。$0表示整條記錄。字段分隔符使用shell環(huán)境變量IFS或由參數(shù)指定。
④ 把當(dāng)前輸入記錄依次與每一個(gè)awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執(zhí)行對(duì)應(yīng)的actions。如果不匹配,就跳過對(duì)應(yīng)的actions,直到比較完所有的awk_cmd。
⑤ 當(dāng)一條輸入記錄比較了所有的awk_cmd后,awk讀取輸入的下一行,繼續(xù)重復(fù)步驟③和④,這個(gè)過程一直持續(xù),直到awk讀取到文件尾。
⑥ 當(dāng)awk讀完所有的輸入行后,如果存在END,就執(zhí)行相應(yīng)的actions。

4) iput_file可以是多于一個(gè)文件的文件列表,awk將按順序處理列表中的每個(gè)文件。
5) 一條awk_cmd的awk_pattern可以省略,省略時(shí)不對(duì)輸入記錄進(jìn)行匹配比較就執(zhí)行相應(yīng)的actions。一條awk_cmd的actions也可以省略,省略時(shí)默認(rèn)的動(dòng)作為打印當(dāng)前輸入記錄(print $0) 。一條awk_cmd中的awk_pattern和actions不能同時(shí)省略。
6) BEGIN區(qū)塊和END區(qū)塊別位于awk_script的開頭和結(jié)尾。awk_script中只有END區(qū)塊或者只有BEGIN區(qū)塊是被允許的。如果awk_script中只有BEGIN { actions } ,awk不會(huì)讀取input_file。
7) awk把輸入文件的數(shù)據(jù)讀入內(nèi)存,然后操作內(nèi)存中的輸入數(shù)據(jù)副本,awk不會(huì)修改輸入文件的內(nèi)容。
8) awk的總是輸出到標(biāo)準(zhǔn)輸出,如果想讓awk輸出到文件,可以使用重定向。

4.awk_pattern
awk_pattern模式部分決定actions動(dòng)作部分何時(shí)觸發(fā)及觸發(fā)actions。awk_pattern可以是以下幾種類型:
1) 正則表達(dá)式用作awk_pattern: /regexp/
① awk中正則表達(dá)式匹配操作中經(jīng)常用到的字符:
\ ^ $ . [] | () * // 通用的regexp元字符
+ : 匹配其前的單個(gè)字符一次以上,是awk自有的元字符,不適用于grep或sed等
: 匹配其前的單個(gè)字符1次或0次,是awk自有的元字符,不適用于grep或sed等
② 舉例:
awk '/ *\$0\.[0-9][0-9].*/' input_file
2) 布爾表達(dá)式用作awk_pattern,表達(dá)式成立時(shí),觸發(fā)相應(yīng)的actions執(zhí)行。
① 表達(dá)式中可以使用變量(如字段變量$1,$2等)和/regexp/
② 布爾表達(dá)式中的操作符:
關(guān)系操作符: < > <= >= == !=
匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,則返回真
value !~ /regexp/ 如果value不匹配/regexp/,則返回真
舉例: awk '$2 > 10 {print "ok"}' input_file
awk '$3 ~ /^d/ {print "ok"}' input_file
③ &&(與) 和 ||(或) 可以連接兩個(gè)/regexp/或者布爾表達(dá)式,構(gòu)成混合表達(dá)式。!(非) 可以用于布爾表達(dá)式或者/regexp/之前。
舉例: awk '($1 < 10 ) && ($2 > 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print "ok"}' input_file
④ 其它表達(dá)式用作awk_script,如賦值表達(dá)式等
eg: awk '(tot+=$6); END{print "total points :" tot }' input_file // 分號(hào)不能省略
awk 'tot+=$6 {print $0} END{print "total points :" tot }' input_file // 與上面等效

5.actions
actions就是對(duì)awk讀取的記錄數(shù)據(jù)進(jìn)行的操作。actions由一條或多條語(yǔ)句或者命令組成,語(yǔ)句、命令之間用分號(hào)(;)分隔。actions中還可以使用流程控制結(jié)構(gòu)的語(yǔ)句。
1) awk的命令:
① print 參數(shù)列表 : print可以打印字符串(加雙引號(hào))、變量和表達(dá)式,是awk最基本的命令。參數(shù)列表要用逗號(hào)(,)分隔,如果參數(shù)間用空格分隔,打印出時(shí)參數(shù)值之間不會(huì)有空格。
② printf ([格式控制符],參數(shù)) : 格式化打印命令(函數(shù)),語(yǔ)法與C語(yǔ)言的printf函數(shù)類似。
③ next : 強(qiáng)迫awk立刻停止處理當(dāng)前的記錄,而開始讀取和處理下一條記錄。
④ nextfile : 強(qiáng)迫awk立刻停止處理當(dāng)前的輸入文件而處理輸入文件列表中的下一個(gè)文件
⑤ exit : 使awk停止執(zhí)行而跳出。如果有END 存在,awk會(huì)去執(zhí)行END 的actions。

2) awk的語(yǔ)句: awk的語(yǔ)句主要是賦值語(yǔ)句,用來(lái)給變量賦值。
① 把直接值或一個(gè)變量值賦值給變量。如果直接值是字符串要加雙引號(hào)。
舉例: awk 'BEGIN {x=1 ; y=3 ; x=y ; print "x=" x " ; y=" y }'
② 把一個(gè)表達(dá)式的值賦值給變量。表達(dá)式一般是數(shù)值表達(dá)式,也可以是其它表達(dá)式。
數(shù)值表達(dá)式: num1 operator num2
operator可以是: +(加) -(減) *(乘) /(除) %(取模) ^(求冪)
當(dāng)num1或者num2是字符串而是不是數(shù)字時(shí),無(wú)論是否加有雙引號(hào),awk都視其值為0
條件選擇表達(dá)式: A?B:C (A為布爾表達(dá)式,B和C可以是表達(dá)式或者直接值)
當(dāng)布爾表達(dá)式A的值為真時(shí),整個(gè)表達(dá)式的值為B,A的值為假時(shí),整個(gè)表達(dá)式的值為C
舉例: awk 'BEGIN {x=3 ; x+=2 ; y=x+2 ; print "x=" x " ; y=" y }'
awk 'BEGIN {x=3 ; y=x>4?"ok":4 ; print "x=" x " ; y=" y }'
③ 為了方便書寫,awk也支持C語(yǔ)言語(yǔ)法的賦值操作符: += -= *= /= %= ^= ++ --

3) 流程控制結(jié)構(gòu) (基本上是使用C語(yǔ)言的語(yǔ)法)
其中condition一般為布爾表達(dá)式,body和else-body是awk語(yǔ)句塊。
① if (condition) {then-body} [else {else-body}]
② while (condition) {body}
③ do {body} while (condition)
④ for (initialization; condition; increment) {body}
與C語(yǔ)言的for結(jié)構(gòu)的語(yǔ)法相同。
⑤ break : 跳出包含它的for、while、do-while 循環(huán)
⑥ continue : 跳過for、while、do-while循環(huán)的body的剩余部分,而立刻進(jìn)行下一次循環(huán)的執(zhí)行。

6.awk的變量
在awk_script中的表達(dá)式中要經(jīng)常使用變量。不要給變量加雙引號(hào),那樣做,awk將視之為字符串。awk的變量基本可以分為兩類:
1) awk內(nèi)部變量: awk的內(nèi)部變量用于存儲(chǔ)awk運(yùn)行時(shí)的各種參數(shù),這些內(nèi)部變量又可以分為:
① 自動(dòng)內(nèi)部變量: 這些變量的值會(huì)隨著awk程序的運(yùn)行而動(dòng)態(tài)的變化,在awk_script中改變這些變量的值是沒有意義的(即不應(yīng)該被賦值)。常見的有:
NF : 當(dāng)前輸入字段的字段數(shù)
NR : 對(duì)當(dāng)前輸入文件而言,已經(jīng)被awk讀取過的記錄(行)的數(shù)目。
FNR : 已經(jīng)被awk讀取過的記錄(行)的總數(shù)目。當(dāng)輸入文件只有一個(gè)時(shí),F(xiàn)NR和NR是一致的。
FILENAME : 當(dāng)前輸入文件的文件名。
ARGC : 命令行參數(shù)個(gè)數(shù)。(不包括選項(xiàng)和awk_script,實(shí)際就是輸入文件的數(shù)目加1)
ARGIND : 當(dāng)前被處理的文件在數(shù)組ARGV內(nèi)的索引( 實(shí)際上ARGV[1]就是第一個(gè)輸入文件 )
舉例: awk '{print NR,NF,$0} END {print FILENAME}' input_file
② 字段變量($0 $1 $2 $3 ...): 當(dāng)awk把當(dāng)前輸入記錄分段時(shí),會(huì)對(duì)這些字段變量賦值。和內(nèi)部變量類似,在awk運(yùn)行過程中字段變量的值是動(dòng)態(tài)變化的。不同的是,修改這些字段變量的值是有意義的,被修改的字段值可以反映到awk的輸出中。
可以創(chuàng)建新的輸出字段,比如,當(dāng)前輸入記錄被分割為8個(gè)字段,這時(shí)可以通過對(duì)變量 $9 (或$9之后的字段變量)賦值而增加輸出字段,NR的值也將隨之變化。
字段變量支持變量名替換。
舉例: pwd |awk -F/ '{print $NF}' // print $NF 打印輸入記錄的最后一個(gè)字段
awk '{x=2;print $x}' input_file // 打印輸入記錄的第2個(gè)字段
③ 其它內(nèi)部變量: 可以修改這些變量。常見的有:
FS : 輸入記錄的字段分隔符(默認(rèn)是空格和制表符)
OFS : 輸出記錄的字段分隔符(默認(rèn)是空格)
OFMT : 數(shù)字的輸出格式(默認(rèn)是 %.6g)
RS : 輸入記錄間的分隔符(默認(rèn)是NEWLINE)
ORS : 輸出記錄間的分隔符(默認(rèn)是NEWLINE)
ARGV : 命令行參數(shù)數(shù)組
ENVIRON : 存儲(chǔ)系統(tǒng)當(dāng)前環(huán)境變量值的數(shù)組,它的每個(gè)成員的索引就是一個(gè)環(huán)境變量名,而對(duì)應(yīng)的值就是相應(yīng)環(huán)境變量的值??梢酝ㄟ^給ENVIRON數(shù)組的成員賦值而改變環(huán)境變量的值,但是新值只在awk_script內(nèi)有效。eg: ENVIRON["HISTSIZE"]=500
舉例: cat /etc/passwd | awk 'BEGIN { FS=":" } {print "User name: "$1,"UID: "$4}'

2) 自定義變量
1) 定義變量: varname=value (自定義變量不需先聲明后使用,賦值語(yǔ)句同時(shí)完成變量定義和初始化)
2) 在表達(dá)式中出現(xiàn)不帶雙引號(hào)的字符串都被視為變量,如果之前未被賦值,默認(rèn)值為0或空字符串。
3) 向命令行awk程序傳遞變量的值:
① Usage: awk 'awk_script' awkvar1=value1 awkvar2=value2 .... input_file
eg: awk '{if ($5 < ARG) print $0 }' ARG=100 input_file
② awkvar可以是awk內(nèi)置變量或自定義變量。
③ awkvar的值將在awk開始對(duì)輸入文件的第一條記錄應(yīng)用awk_script前傳入。如果在awk_script中已經(jīng)對(duì)某個(gè)變量賦值,那么在命令行上傳人到該變量的值就會(huì)無(wú)效(實(shí)際上是awk_script中的賦值語(yǔ)句覆蓋了從命令行上傳入的值)。
④ 在awk腳本程序中不能直接使用shell的變量。通過使用下面的語(yǔ)法可達(dá)到這樣的效果。
awk 'awk_script' awkvar1=shellvar1 awkvar2=shellvar2 .... input_file
eg: awk '{if (v1 == "root") {print "User name is root!"}}' v1=$USER input_file
⑤ 可以向awk腳本傳遞變量的值,與上面的類似。
awk_script_file awkvar1=value1 awkvar2=value2 ... input_file

7.awk的內(nèi)置函數(shù)
可以在awk_script的任何地方使用awk函數(shù)。和awk變量一樣,awk函數(shù)可以分為內(nèi)置函數(shù)和自定義函數(shù)。
1) 常見awk內(nèi)置數(shù)值函數(shù)
int(x) : 求出x 的整數(shù)部份,朝向0 的方向做舍去。eg: int(3.9)是3,int(-3.9) 是-3。
sqrt(x) : 求出x 正的平方根值。eg: sqrt(4)=2
exp(x) : 求出x 的次方。eg: exp(2) 即是求e*e 。
log(x) : 求出x 的自然對(duì)數(shù)。
sin(x) : 求出x 的sine 值,x 是弳度量。
cos(x) : 求出x 的cosine 值,x 是弳度量。
atan2(y,x) : 求y/x 的arctangent 值,所求出的值其單位是弳度量。
rand() : 得到一個(gè)隨機(jī)數(shù)(平均分布在0和1之間)。每次執(zhí)行g(shù)awk,rand從相同的seed生成值。
srand(x) : 設(shè)定產(chǎn)生隨機(jī)數(shù)的seed為x。如果在第二次運(yùn)行awk程序時(shí)你設(shè)定相同的seed值,你將再度得到相同序列的隨機(jī)數(shù)。如果省略引數(shù)x,例如srand(),則當(dāng)前日期時(shí)間會(huì)被當(dāng)成seed。這個(gè)方法可使得隨機(jī)數(shù)值是真正不可預(yù)測(cè)的。
srand() : 其值是當(dāng)次awk_script運(yùn)行過程中前次srand(x)的設(shè)定的seed值x,。
2) 常見awk內(nèi)置字符串函數(shù)
index(in, find) : 返回字符串in中字符串find第一次出現(xiàn)的位置(索引從1開始),如果在字串in中找不到字符串find,則返回值為0。eg: print index("peanut","an") 會(huì)印出3。
length(s) : 求出字符串s的字符個(gè)數(shù)。eg: length("abcde") 是5。
match(s,r) : 返回模式字符串r在字符串s的第一次出現(xiàn)的位置,如果s不包含r,則返回值0。
sprintf(fmt,exp1,...) : 和printf類似印出,是sprintf不是打印而是返回經(jīng)fmt格式化后的exp。
eg: sprintf("pi = %.2f (approx.)",22/7) 傳回的字串為"pi = 3.14 (approx.)"
sub(p, r,t) : 在字符串t中尋找符合模式字符串p的最靠前最長(zhǎng)的位置,并以字符串r代替最前的p。
eg: str = "water, water"sub(/at/, "ith",str) 結(jié)果字符串str 會(huì)變成"wither, water"
gsub(p, r, t) : gsub與sub類似。不過時(shí)在字符串t中以字符串r 代替所有的p。
eg: str="water, water" ; gsub(/at/, "ith",str) 結(jié)果字符串str會(huì)變成"wither,wither"
substr(str, st, len) : 傳回str的子字符串,其長(zhǎng)度為len字符,從str的第st個(gè)位置開始。如果len沒有出現(xiàn),則傳回的子字符串是從第st個(gè)位置開始至結(jié)束。
eg: substr("washington",5,3) 傳回值為"ing"
substr("washington",5) 傳回值為"ington"
split(s,a,fs) : 在分隔符fs為分隔符將字符串s分隔成一個(gè)awk數(shù)組a,并返回a的下標(biāo)數(shù)。
eg: awk 'BEGIN{print split("123#456#789",myarray,"#")}' 將打印 3 。
tolower(str) : 將字符串str的大寫字母改為小寫字母。
eg: tolower("MiXeD cAsE 123") 傳回值為"mixed case 123"
toupper(str) : 將字符串string 的小寫字母改為大寫字母。
eg: toupper("MiXeD cAsE 123")傳回值為"MIXED CASE 123"
3) 常見awk內(nèi)置系統(tǒng)函數(shù)
close(filename) : 將輸入或輸出的文件filename 關(guān)閉。
system(command) : 此函數(shù)允許調(diào)用操作系統(tǒng)的指令,執(zhí)行完畢後將回到awk程序。
eg: awk 'BEGIN {system("ls")}'

8 自定義函數(shù)
復(fù)雜的awk常??梢允褂米约憾x的函數(shù)來(lái)簡(jiǎn)化。調(diào)用自定義的函數(shù)與調(diào)用內(nèi)置函數(shù)的方法一樣。
1) 自定義函數(shù)定義的格式: 自定義函數(shù)可以在awk程序的任何地方定義。
function fun_name (parameter_list) { // parameter_list是以逗號(hào)分隔的參數(shù)列表
body-of-function // 函數(shù)體,是awk語(yǔ)句塊
}
2) 舉例:
awk '{ print "sum =",SquareSum($1,$2) }
function SquareSum(x,y) { sum=x*x+y*y ; return sum } ' grade.txt

9.awk的數(shù)組
數(shù)組使用前,不必預(yù)先定義,也不必指定數(shù)組元素個(gè)數(shù)。
1) 訪問數(shù)組的元素。經(jīng)常使用循環(huán)來(lái)訪問數(shù)組元素,下面是一種循環(huán)類型的基本結(jié)構(gòu):
for (element in array_name ) print array_name[element]
2) 舉例: awk 'BEGIN{print split("123#456#789",mya,"#") ; for (i in mya) { print mya[i] }} '

10.其他
1) 為了避免碰到awk錯(cuò)誤,可以總結(jié)出以下規(guī)律:
① 確保整個(gè)awk_script用單引號(hào)括起來(lái)。
② 確保awk_script內(nèi)所有引號(hào)成對(duì)出現(xiàn)。
③ 確保用花括號(hào)括起動(dòng)作語(yǔ)句,用圓括號(hào)括起條件語(yǔ)句。
④ 可能忘記使用花括號(hào),也許你認(rèn)為沒有必要,但awk不這樣認(rèn)為,將按之解釋語(yǔ)法。
⑤ 如果使用字符串,一定要保證字符串被雙引號(hào)括起來(lái)(在模式中除外)。
2) 在awk中,設(shè)置有意義的域名是一種好習(xí)慣,在進(jìn)行模式匹配或關(guān)系操作時(shí)更容易理解。一般的變量名設(shè)置方式為name=$n。(這里name為調(diào)用的域變量名, n為實(shí)際域號(hào)。)
3) 通常在BEGIN部分給一些變量賦值是很有益的,這樣可以在awk表達(dá)式進(jìn)行改動(dòng)時(shí)減少很多麻煩。
4) awk的基本功能是根據(jù)指定規(guī)則抽取輸入數(shù)據(jù)的部分內(nèi)容并輸出,另一個(gè)重要的功能是對(duì)輸入數(shù)據(jù)進(jìn)行分析運(yùn)算得到新的數(shù)據(jù)并輸出,這是通過在awk_script中對(duì)字段變量($1、$2、$3...)從新賦值或使用更大的字段變量$n(n大于當(dāng)前記錄的NF)而實(shí)現(xiàn)的。
5) 使用字符串或正則表達(dá)式時(shí),有時(shí)需要在輸出中加入一新行或查詢一元字符。這時(shí)就需要字符串屏蔽序列。awk中經(jīng)常使用的屏蔽序列有:
\b 退格鍵 \t tab鍵 \f 走紙換頁(yè) \ddd 八進(jìn)制值 \n 新行 \r 回車鍵
\c 任意其他特殊字符。eg: \\為反斜線符號(hào)
6) awk的輸出函數(shù)printf,基本上和C語(yǔ)言的語(yǔ)法類似。
① 格式: printf ("輸出模板字符串",參數(shù)列表)
② 參數(shù)列表是以逗號(hào)分隔的列表,參數(shù)可以是變量、數(shù)字值或字符串。
③ 輸出模板字符串的字符串中必須包含格式控制符,有幾個(gè)參數(shù)就要求有幾個(gè)格式控制符。模板字符串中可以只有格式控制符而沒有其它字符。
④ 格式控制符: %[-][width][.prec]fmt
% : 標(biāo)識(shí)一個(gè)格式控制符的開始,不可省略。
- : 表示參數(shù)輸出時(shí)左對(duì)齊,可省略。
width : 一個(gè)數(shù)字,表示參數(shù)輸出時(shí)占用域的寬度,可省略。
.prec : prec是一個(gè)數(shù)值,表示最大字符串長(zhǎng)度或小數(shù)點(diǎn)右邊的位數(shù),可省略。
fmt : 一個(gè)小寫字母,表示輸出參數(shù)的數(shù)據(jù)類型,不可省略。
⑤ 常見的fmt : c ASCII字符
d 整數(shù)
e 浮點(diǎn)數(shù),科學(xué)記數(shù)法
f 浮點(diǎn)數(shù),如 123.44
g 由awk決定使用哪種浮點(diǎn)數(shù)轉(zhuǎn)換e或f
o 八進(jìn)制數(shù)
s 字符串
x 十六進(jìn)制數(shù)
⑥ 舉例: echo "65" | awk '{ printf ("%c\n",$0) }' // 將打印 A
awk 'BEGIN{printf "%.4f\n",999}' //將打印 999.0000
awk 'BEGIN{printf "2 number:%8.4f%8.2f",999,888}' // 將打印 2 number:999.0000 888.000
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【awk】awk語(yǔ)法(小結(jié))
awk 命令
linux命令終極系列(awk
Unix awk使用手冊(cè)
awk命令
Linux最方便的4個(gè)命令(生信方向)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服