?? awk最新教程.txt
字號(hào):
第一章 簡(jiǎn)介
awk是Unix操作系統(tǒng)提供的一個(gè)程序化語(yǔ)句,是為了使信息和文本的處理更易于表達(dá)和完成而設(shè)計(jì)的。它對(duì)于資料的處理具有很強(qiáng)的功能:對(duì)于文本文件里的內(nèi)容做修改、對(duì)比、抽取等的處理,可以以很短的語(yǔ)句輕易完成。而象C或Pascal等高級(jí)語(yǔ)言要完成上述的動(dòng)作,相對(duì)要麻煩得多。
awk 是在一組輸入信息或文件上運(yùn)行的,它瀏覽輸入行,按照行次順序,一次一行地進(jìn)行處理。在一行中尋找程序中描述的模式,發(fā)現(xiàn)該模式,則進(jìn)行相應(yīng)的操作,處理完一行后,再進(jìn)行下一行的處理,直到文件結(jié)束。從awk在操作系統(tǒng)中所處的位置(/usr/bin/awk)來(lái)看,awk是Unix的一個(gè)命令;從它提供的內(nèi)部語(yǔ)句來(lái)看,awk又象是一個(gè)程序語(yǔ)言。在以后的討論中稱它為語(yǔ)句或程序,但這都沒(méi)什么區(qū)別。
awk 這個(gè)名字是由它的幾個(gè)設(shè)計(jì)者姓氏的第一個(gè)字母而命名:Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。awk最初在1977年完成,后來(lái)又經(jīng)過(guò)多次修改,這里討論的awk實(shí)例都是在SCO UNIX 3.0 上通過(guò)的。
第二章 基礎(chǔ)知識(shí)
2.1.基本程序結(jié)構(gòu)
awk 程序是由若干個(gè)“模式”與“動(dòng)作”所組成的,其執(zhí)行方式是針對(duì)文件中的每一行(line)搜索指定的模式(patterns),當(dāng)一行中有符合指定的模式,awk就會(huì)在此一行執(zhí)行被指定的動(dòng)作(actions)。awk 依次方式處理輸入文件的每一行直到輸入文件結(jié)束。“動(dòng)作”一般寫在花括號(hào){ } 里面,一個(gè)模式后面就跟著一個(gè)動(dòng)作,一個(gè)動(dòng)作可以是一條或多條語(yǔ)句。
整個(gè)awk程式就象下面的形式:
awk ‘模式 {動(dòng)作} ................. 模式 { 動(dòng)作 }’ filename
這種形式是從filename文件中讀入數(shù)據(jù)
command | awk ‘模式 { 動(dòng)作 } .............. 模式 { 動(dòng)作 }’
這種形式通過(guò)管道將命令的輸出傳遞給awk語(yǔ)句。
例:
awk ‘$1 == ”127.0.0.1” { print $2 }’ /etc/hosts #從/etc/hosts中讀入數(shù)據(jù)
cat /etc/hosts | awk ‘$1 == “127.0.0.1” { print $2 }’ #則是接收cat /etc/hosts的結(jié)果
以上兩個(gè)例子都是將/etc/hosts文件中所有第一個(gè)字段為127.0.0.1的行的第二個(gè)字段打印出來(lái)。
其運(yùn)行結(jié)果為:
localhost
在awk中,“模式”或“動(dòng)作”能夠被省略,但通常是省略模式。模式被省略后,對(duì)于輸入文件里面的每一行,動(dòng)作都會(huì)被執(zhí)行。而如果“動(dòng)作”被省略,awk語(yǔ)句只會(huì)去尋找你所指定的模式,但即使找到了也不執(zhí)行其它任何操作(因?yàn)闆](méi)有指定動(dòng)作),就象在Unix系統(tǒng)中你用find命令去尋找一個(gè)文件,但是沒(méi)有用 –print 參數(shù)來(lái)說(shuō)明要顯示一樣,find只是找到了這個(gè)文件,但并不顯示出來(lái)。
如:awk ‘{ print $2 }’ /etc/hosts #從/etc/hosts文件中讀入數(shù)據(jù),將每個(gè)記錄(行)的第二個(gè)字段打印出來(lái)。
運(yùn)行結(jié)果為:localhost peixun1
而:awk ‘$1=“127.0.0.1”’ /etc/hosts 只是在/etc/hosts文件中尋找,看看哪一行的第一個(gè)字段為127.0.0.1,不管找到與否,一概不顯示。 所以結(jié)果是:什么都沒(méi)有
2.2.如何執(zhí)行awk語(yǔ)句
基本上,有三種方法可以執(zhí)行awk語(yǔ)句。
a. 如果awk程序很短,則awk可以直接寫在命令行上:
awk 'program' input-file1 input-file2 ...
其中program包括一些模式和動(dòng)作,就象前面的例子一樣。input-file1 input-file2 ...為數(shù)據(jù)文件名,程序?qū)闹凶x取數(shù)據(jù)。文件名可以多于一個(gè),當(dāng)同時(shí)存在多個(gè)文件名時(shí),程序?qū)㈨樞蛱幚磉@些文件。
b. 如果awk語(yǔ)句較長(zhǎng),較為方便也是通常的做法是將整個(gè)awk語(yǔ)句存放在一個(gè)文本文件中,通過(guò)文件名來(lái)執(zhí)行這段程序。如一個(gè)awk命令的所有語(yǔ)句都放在了一個(gè)叫mypro的文件中,那么可以通過(guò)下面的方式來(lái)執(zhí)行:
mypro
c. 也可以只將'program'部分即“模式與動(dòng)作”部分寫在文件中,通過(guò)以下的方式執(zhí)行:
awk -f program-file1 -f program-file2 ...input-file1 input-file2 ...
其中,program-file1,program-file2是存放“模式與動(dòng)作”的文件名稱,他通過(guò)-f參數(shù)被調(diào)用,命令文件的個(gè)數(shù)也可以有多個(gè),在使用時(shí),每個(gè)文件名前面都必須要有-f參數(shù)。
如:
file1為:‘{ print $1,$2,$3 }’
file2為:‘{ print $2,$3,$4 }’
file3為: I am a student
file4為: You are a teacher
則:執(zhí)行 awk -f ./file1 -f ./file2 ./file3 ./file4 的結(jié)果為:
I am a am a student You are a are a student
我們建議使用第二種方法,簡(jiǎn)單而又方便。
2.3 變量
awk中的變量和Shell中的變量相似,都不用事先定義,也沒(méi)有類型的區(qū)別(都是字符串型),在使用時(shí)可隨時(shí)進(jìn)行定義。
awk中的變量分以下幾種:
1)字段變量 awk處理數(shù)據(jù)時(shí)是逐行進(jìn)行處理的,字段變量就是在處理過(guò)程中表示當(dāng)前記錄各字段的變量,其形式和含義如下:$0 所處理的當(dāng)前行(字符串);
$1 當(dāng)前行(記錄)的第一個(gè)字段
$2 當(dāng)前行(記錄)的第二個(gè)字段
$3 當(dāng)前行(記錄)的第三個(gè)字段
………
如: awk ‘{ print $1,“|”,$2 }’ /tmp/test
該語(yǔ)句將/tmp目錄下的test文件的第一和第二個(gè)字段打印出來(lái),字段間的分隔符為“|”.
2) 內(nèi)部變量 awk的每次執(zhí)行,都建立了一些缺省的變量,也叫做內(nèi)部變量,這些變量有固定的名字和固定的含義,它們?cè)诔绦蜻\(yùn)行期間可以隨時(shí)被引用。
具體定義如下:
FS 輸入記錄字段間的分隔符
RS 輸入記錄的分隔符
OFS 輸出記錄字段間的分隔符
ORS 輸出記錄的分隔符
NR 當(dāng)前行數(shù)
NF 當(dāng)前記錄字段數(shù)
ARGC 命令行參數(shù)個(gè)數(shù)
前四個(gè)內(nèi)部變量在使用時(shí)一般用于設(shè)定你所需要的分隔副符,具體的使用方法如下例所示:
awk ‘BEGIN { FS=“|” ;OFS=”|” } { print $1,$2,…… }’ 文件名 #指明輸入輸出時(shí)都以“|”為字段間的分隔符
后面三個(gè)內(nèi)部變量用于模式部分較多,在動(dòng)作部分也有使用。
awk ‘ NR==10 { print $1,$2,…… }’ 文件名 #用于限定只對(duì)第十行進(jìn)行處理。
awk ‘ BEGIN { SUM=0 } { SUM=SUM+NF } END { print “本文總共” SUM “個(gè)字段” }’ 文件名
#對(duì)SUM變量賦初值,同時(shí)利用NF變量獲得每行字段數(shù)的總和;
3) 自定義變量在awk語(yǔ)言的任意動(dòng)作區(qū)間,即在{}之內(nèi),均可隨時(shí)定義變量,無(wú)須事先說(shuō)明。但一般情況下是在BEGIN中定義變量并賦以初值,在動(dòng)作區(qū)域內(nèi)使用。
如:awk ‘BEGIN { sum=“0” } { sum=sum+1 } END { print sum }’file
上面命令定義變量sum,其初值為0,對(duì)于每一條記錄變量sum加1,整條語(yǔ)句將計(jì)算出文件總的字段數(shù)。
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -