awk是一個(gè)強(qiáng)大的文本分析工具,相對(duì)于grep的查找,sed的編輯,awk在其對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得尤為強(qiáng)大。簡(jiǎn)單來說awk就是把文件逐行的讀入,以空格為默認(rèn)分隔符將每行切片,切開的部分再進(jìn)行各種分析處理。
為烏海海南等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及烏海海南網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站制作、烏海海南網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
awk有三個(gè)不同的版本:awk、nawk和gawk,未作特別說明,一般指gawk,gawk是awk的GNU版本。
之所以叫awk是因?yàn)槠淙×巳粍?chuàng)始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family Name
的首字符。
使用方法:
awk'{pattern+action}'{filenames}
盡管操作可能會(huì)很復(fù)雜,但語法總是這樣,其中pattern表示awk在數(shù)據(jù)中查找的內(nèi)容,而action是在找到匹配內(nèi)容時(shí)所執(zhí)行的一系列命令。花括號(hào)({})不需要在程序中始終出現(xiàn),但它們用于根據(jù)特定的模式對(duì)一系列指令進(jìn)行分組。pattern就是要表示的正則表達(dá)式,用斜杠括起來。
awk語言的最基本功能是在文件或者字符串中基于指定規(guī)則瀏覽和抽取信息,awk抽取信息后,才能進(jìn)行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。
通常,awk是以文件的一行為處理單位的。awk每接收文件的一行,然后執(zhí)行相應(yīng)的命令,來處理文本。
調(diào)用awk的三種方式
1、命令行方式
awk[-F field-separator]'commands'input-file(s)
其中,commands是真正awk命令,[-F域分隔符]是可選的。input-file(s)是待處理的文件。
在awk中,文件的每一行中,由域分隔符分開的每一項(xiàng)稱為一個(gè)域。通常,在不指名-F域分隔符的情況下,默認(rèn)的域分隔符是空格。
2、shell腳本方式
將所有的awk命令插入一個(gè)文件,并使awk程序可執(zhí)行,然后awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調(diào)用。
相當(dāng)于shell腳本首行的:#!/bin/sh
可以換成:#!/bin/awk
3、將所有的awk命令插入一個(gè)單獨(dú)文件,然后調(diào)用:
awk-f awk-script-file input-file(s)
其中,-f選項(xiàng)加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
一次讀取一行文本,按輸入分隔符進(jìn)行切片,切成多個(gè)組成部分,將每片直接保存在內(nèi)建的變量中,$1,$2,$3....,引用指定的變量,可以顯示指定段,或者多個(gè)段。如果需要顯示全部的,需要使用$0來引用??梢詫?duì)單個(gè)片段進(jìn)行判斷,也可以對(duì)所有段進(jìn)行循環(huán)判斷。
其默認(rèn)分隔符為空格
awk [options] 'program' FILE......
[options]說明
主要有兩種模式
1、 awk [options] 'scripts' file1,file2.....
在這種模式中,scripts主要是命令的堆砌,命令之間用 分號(hào) 分割;對(duì)輸入的文本行進(jìn)行處理,通過命令 print,printf 或是輸出重定向的方式顯示出來,這里經(jīng)常用到的知識(shí)點(diǎn)是:awk的內(nèi)置變量,以及命令print和printf的使用
2、 awk [options] 'PATTERN{action}' file,file2.....
在這種模式中,最重要的是5種模式和5種action的使用,以及awk的數(shù)組的使用和內(nèi)置函數(shù)
其格式化輸出: printf FORMAT,item1,item2....
例子: awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt
格式符
修飾符
輸出重定向
awk [option] 'PATTERN{action}' file1,file2....
awk是一個(gè)強(qiáng)大的文本分析工具,與grep、sed相比,awk在對(duì)數(shù)據(jù)分析并生成報(bào)告時(shí),顯得有很大的優(yōu)勢(shì)。
awk有三個(gè)不同的版本:awk、nawk和gawk,在沒有做特殊說時(shí)的時(shí)候默認(rèn)的就是gawk,gawk是awk的GNU版本。
其中command是真正的awk命令,-F表示域的分隔符,是個(gè)可選項(xiàng)。Filename是等待處理的文件
將所有的awk命令寫入到一個(gè)文件,并使用該文件有X權(quán)限,然后awk命令解釋器作為腳本的首行,也就是說可以把腳本最開始的 #!/bin/bash 換成 #!/bin/awk
最后直接執(zhí)行這個(gè)腳本文件就行了。
-f 指定要加載的awk腳本,是一個(gè)文件。Filename是等待處理的文件
awk的工作流程是這樣的:讀入一行后(最后面帶有” ”的),就按-F指定的分隔符來將該行劃分成N個(gè)區(qū)域,$0表示所有的區(qū)域,$1表示第一個(gè)域,$2表示第二個(gè)域,依此類推,$n表示第n個(gè)域。
總結(jié):awk先執(zhí)行BEGIN內(nèi)的命令,然后再讀入文件中的行,接著就是按照指定的分隔符將該行分成N個(gè)區(qū)域,然后再來執(zhí)行模式所對(duì)應(yīng)的動(dòng)作action。然后,再來讀入第二行。。再重復(fù)執(zhí)行action,直到所有的行都處理完成。最后再執(zhí)行END中的命令。
注意:' // '之間是支持正則表達(dá)式的,如果此處只有pattern,而沒有action,那么awk默認(rèn)會(huì)把匹配到的行打印出來。
awk中的print還可以使用C語言中的printf來替代。在輸出格式比較復(fù)雜的時(shí)候使用printf函數(shù)會(huì)比print函數(shù)要更直觀一些,如下:
還可以使用-v key=value來自定義變量。如下:
awk中的條件語句是從C中借鑒過來的
語法:if (condition) {then-body} else {else-body}
例如使用awk來統(tǒng)計(jì)某個(gè)目錄下的普通文件的大小,不包括子目錄的,并過濾掉目錄。
循環(huán)語句也和C中的一樣,支持while、do/while、for、continue、break等關(guān)鍵字。
break和continue常用于循環(huán)中;
在awk中,數(shù)組的下標(biāo)可以是數(shù)字或字母。一般awk中的數(shù)組的作用是從記錄中收集信息,用于計(jì)算總和、統(tǒng)計(jì)單詞等。
在awk中要?jiǎng)h除一個(gè)元素的時(shí)候使用 delete array[index]
更多請(qǐng)參見awk官方文檔[]
awk由三部分組成,BEGIN,END,和帶模式匹配選項(xiàng)的常見語句塊,這三部分都是可選項(xiàng)
NR:表示記錄數(shù)量,在執(zhí)行過程中對(duì)應(yīng)于當(dāng)前的行號(hào)
NF:表示字段數(shù)量,在執(zhí)行過程中對(duì)應(yīng)于當(dāng)前行的字段數(shù)
將外部變量值傳遞給awk
用getline讀取行
AWK通常默認(rèn)讀取一個(gè)文件的所有行,如果只想讀取某一行,可以使用getline函數(shù)
語法:getline var
使用過濾模式對(duì)awk處理的行進(jìn)行過濾
設(shè)置字段界定符 ,默認(rèn)字段是空格
模式:-F "delimiter"
我使用awk命令時(shí),用的次數(shù)最多的是 從stdin或文件里選取幾列輸出 。
awk的print語句:
很久之前,在python celery文檔里見過下面的這個(gè)命令,正是因?yàn)楫?dāng)時(shí)看不懂這個(gè)命令,才開始淺學(xué)awk和xargs。