您好,登錄后才能下訂單哦!
一、awk簡(jiǎn)介:
awk 是一種編程語(yǔ)言,用于在 linux/unix 下對(duì)文本和數(shù)據(jù)進(jìn)行處理。數(shù)據(jù)可以來(lái)自標(biāo)準(zhǔn)輸入、一個(gè)或多個(gè)文件,或其它命令的輸出。它支持用戶(hù)自定義函數(shù)和動(dòng)態(tài)正則表達(dá)式等先進(jìn)功能,是linux/unix下的一個(gè)強(qiáng)大編程工具。它在命令行中使用,但更多是作為腳本來(lái)使用。
awk 的處理文本和數(shù)據(jù)的方式是這樣的,它逐行掃描文件,從第一行到最后一行,尋找匹配的特定模式的行,并在這些行上進(jìn)行你想要的操作。如果沒(méi)有指定處理動(dòng)作,則把匹配的行顯示到標(biāo)準(zhǔn)輸出(屏幕),如果沒(méi)有指定模式,則所有的操作的所指定的行都被處理。
二、awk的兩種形式語(yǔ)法格式
awk?[options]?'commands'?filenames???//過(guò)濾并輸出文件符合條件的內(nèi)容 awk?[options]?-f?awk-script-file?filenam??????//從腳本中調(diào)用編輯指令,過(guò)濾并輸出內(nèi)容
options:
-F??定義輸入字段分隔符,。默認(rèn)的分隔符是空格或制表符(tab)
commands
BEGIN{}?{}?END{} 行處理前?行處理?行處理后 BEGIN{}?通常用于定義一些變量,例如?BEGIN{FS=":";OFS="---"}
使用BEGIN語(yǔ)句設(shè)置計(jì)數(shù)和打印頭。BEGIN語(yǔ)句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文本開(kāi)始執(zhí)行,END語(yǔ)句用來(lái)在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)。
awk命令格式
awk?'pattern'?filename??????????示例:awk?-F:?'/root/'?/etc/passwd? awk?'{action}'?filename?????????示例:awk?-F:?'{print?$1}'?/etc/passwd? awk?'pattern?{action}'?filename?示例:awk?-F:?'/root/{print?$1,$3}'?/etc/passwd? ????????????????????????????????示例:awk?'BEGIN{FS=":"}?/root/{print?$1,$3}'?/etc/passwd command?|awk?'pattern?{action}'?示例:df?-P|?grep?'/'?|awk?'$4?>?25000?{print?$4}'
三、awk工作原理
#?awk?-F:?'{print?$1,$3}'?/etc/passwd
(1)awk 使用一行作為輸入,并將這一行賦給內(nèi)部變量$0,每一行也可稱(chēng)為一個(gè)記錄,以換行符結(jié)束
(2)然后,行被:(默認(rèn)為空格或制表符)分解成字段(或域),每個(gè)字段存儲(chǔ)在已編號(hào)的變量中,從$1 開(kāi)始,最多達(dá) 100 個(gè)字段
(3)awk 如何知道用空格來(lái)分隔字段的呢? 因?yàn)橛幸粋€(gè)內(nèi)部變量 FS 來(lái)確定字段分隔符。初始時(shí),F(xiàn)S 賦為空格
(4)awk 打印字段時(shí),將以設(shè)置的方法使用 print 函數(shù)打印,awk 在打印的字段間加上空格,因?yàn)?1,$3 之間有一個(gè)逗號(hào)。逗號(hào)比較特殊,它映射為另一個(gè)內(nèi)部變量,稱(chēng)為輸出字段分隔符 OFS,OFS 默認(rèn)為空格
(5)awk 輸出之后,將從文件中獲取另一行,并將其存儲(chǔ)在$0 中,覆蓋原來(lái)的內(nèi)容,然后將新的字符串分隔成字段并進(jìn)行處理。該過(guò)程將持續(xù)到所有行處理完畢
四、awk內(nèi)建變量
FS:指定每行文本的字段分隔符,默認(rèn)為空格或制表位。(-F) NF:當(dāng)前處理的行的字段個(gè)數(shù)。 NR:當(dāng)前處理的行的行號(hào)(序數(shù))。 $0:當(dāng)前處理的行的整行內(nèi)容。 $n:當(dāng)前處理行的第?n?個(gè)字段(第?n?列)。 FILENAME:被處理的文件名。RS:數(shù)據(jù)記錄分隔,默認(rèn)為\n,即每行為一條記錄。
五、格式化輸出
print函數(shù)
#?date?|awk?'{print?"Month:?"?$2?"\nYear:?"?$NF}' #?awk?-F:?'{print?"username?is:?"?$1?"\t?uid?is:?"?$3}'?/etc/passwd #?awk?-F:?'{print?"\tusername?and?uid:?"?$1,$3?"!"}'?/etc/passwd
printf 函數(shù)
#?awk?-F:?'{printf?"%-15s?%-10s?%-15s\n",?$1,$2,$3}'?/etc/passwd #?awk?-F:?'{printf?"|%-15s|?%-10s|?%-15s|\n",?$1,$2,$3}'?/etc/passwd
%s 字符類(lèi)型
%d 數(shù)值類(lèi)型
占 15 字符
- 表示左對(duì)齊,默認(rèn)是右對(duì)齊
printf 默認(rèn)不會(huì)在行尾自動(dòng)換行,加\n
===========================
六、awk模式
1、正則表達(dá)式:
匹配記錄(整行):
#?awk?'/^alice/'?/etc/passwd #?awk?'$0?~?/^alice/'?/etc/passwd #?awk?'!/alice/'?passwd #?awk?'$0?!~?/^alice/'?/etc/passwd
匹配字段:匹配操作符(~? ? ?!~)
#?awk?-F:?'$1?~?/^alice/'?/etc/passwd #?awk?-F:?'$NF?!~?/bash$/'?/etc/passwd
2、比較表達(dá)式:
比較表達(dá)式采用對(duì)文本進(jìn)行比較,只有當(dāng)條件為真,才執(zhí)行指定的動(dòng)作。比較表達(dá)式使用關(guān)系運(yùn)算符,
用于比較數(shù)字與字符串。
關(guān)系運(yùn)算符
運(yùn)算符 含義 示例
<?小于?x<y <=?小于或等于?x<=y ==?等于?x==y !=?不等于?x!=y >=?大于等于?x>=y >?大于?x>y
#?awk?-F:?'$3?==?0'?/etc/passwd #?awk?-F:?'$3?<?10'?/etc/passwd #?awk?-F:?'$7?==?"/bin/bash"'?/etc/passwd #?awk?-F:?'$1?==?"alice"'?/etc/passwd #?awk?-F:?'$1?~?/alice/?'?/etc/passwd #?awk?-F:?'$1?!~?/alice/?'?/etc/passwd #?df?-P?|?grep?'/'?|awk?'$4?>?25000'
3、條件表達(dá)式:
#?awk?-F:?'$3>300?{print?$0}'?/etc/passwd #?awk?-F:?'{?if($3>300)?print?$0?}'?/etc/passwd #?awk?-F:?'{?if($3>300)?{print?$0}?}'?/etc/passwd #?awk?-F:?'{?if($3>300)?{print?$3}?else{print?$1}?}'?/etc/passwd
4、算術(shù)運(yùn)算:+ - * / %(模) ^(冪 2^3)
可以在模式中執(zhí)行計(jì)算,awk 都將按浮點(diǎn)數(shù)方式執(zhí)行算術(shù)運(yùn)算
#?awk?-F:?'$3?*?10?>?500'?/etc/passwd #?awk?-F:?'{?if($3*10>500){print?$0}?}'?/etc/passwd
5、邏輯操作符和復(fù)合模式
&&?邏輯與?a&&b ||?邏輯或?a||b !?邏輯非?!a
#?awk?-F:?'$1~/root/?&&?$3<=15'?/etc/passwd #?awk?-F:?'$1~/root/?||?$3<=15'?/etc/passwd #?awk?-F:?'!($1~/root/?||?$3<=15)'?/etc/passwd
6、范圍模式
#?awk?'/Tom/,/Suzanne/'?filename
示例
1、統(tǒng)計(jì)系統(tǒng)給用戶(hù)數(shù)
2、統(tǒng)計(jì)用戶(hù)名為4個(gè)字符的用戶(hù)
3、自定義變量。查詢(xún)r(jià)oot用戶(hù)
4、獲得網(wǎng)卡IP(出ipv6以外的所有IP)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。