日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

awk的學(xué)習(xí)和使用(一)

 king9413 2011-01-06

最近接觸了linux的使用和一些命令、工具的使用,awk恐怕是linux用處最廣的工具之一了,今天開(kāi)始,我打算記錄下我的學(xué)習(xí)過(guò)程。


一.awk的簡(jiǎn)介

與sed和grep很相似,awk是一種樣式掃描與處理工具,其功能遠(yuǎn)遠(yuǎn)強(qiáng)于sed和grep,除了幾乎所有的sed和grep功能之外,awk還可以進(jìn)行樣式裝入,流控制,數(shù)學(xué)運(yùn)算符,進(jìn)程控制語(yǔ)句,甚至內(nèi)置的變量和函數(shù)。它具備了一個(gè)完整的語(yǔ)言所應(yīng)具備的特性,實(shí)際上awk確實(shí)擁有自己的語(yǔ)言,awk程序設(shè)計(jì)語(yǔ)言,awk的三位創(chuàng)建者已將其定義為:awk樣式掃描和處理語(yǔ)言。

基于文本的樣式掃描和處理是我們經(jīng)常要做的工作,比如從一個(gè)上千行的具有一定格式的文本文件中找出滿足要求的行并輸出到一個(gè)新文本,就可以使用awk。再比如,監(jiān)控網(wǎng)絡(luò)時(shí),由于網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)非常多,如果需要獲得某些特定的數(shù)據(jù),使用awk過(guò)濾。簡(jiǎn)而言之,awk就是一個(gè)強(qiáng)大的文本處理工具。

在這里有一個(gè)可遵循的一般原則:如果你用普通的shell工具或shell script有困難的話,試試awk,如果awk仍不能解決問(wèn)題,則便用C語(yǔ)言,如果C語(yǔ)言仍然失敗,則移至C++。

二.awk的調(diào)用方式

1.awk命令行的方式,適用于解決簡(jiǎn)單問(wèn)題,例如:打印testfile文本中第一列為abc的所有行(省略了print)

[root@test myself]# awk '$1==abc' testfile

2.使用-f選項(xiàng)調(diào)用awk程序文件,例如:將一段awk程序保存到文本,名為testawk1,在命令行中執(zhí)行該文件

[root@test myself]# awk -f testawk1 testfile

3.利用命令解釋器調(diào)用awk,例如:將一段awk程序保存至文本,名為myawk,與前面不同的是該文本首行需要添加:#!/bin/awk -f ,保存后賦予該文件執(zhí)行權(quán)限,命令行中直接調(diào)用:

[root@test myself]# myawk testfile

三.awk語(yǔ)法

awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

-F re: 允許awk更改其字段分隔符。

parameter:

'prog': awk程序語(yǔ)句段,必須使用單引號(hào)‘’引起來(lái),防止被shell解釋。

其標(biāo)準(zhǔn)形式為'pattern{action}'。前面第二節(jié)中的第一小節(jié)舉例:awk '$1==abc' testfile其中'$1==abc'就是pattern,起過(guò)濾作用,即:只有符合$1==abc的行,才執(zhí)行執(zhí)行{action}操作。但此例中省略了{(lán)action},此時(shí)將默認(rèn)執(zhí)行print操作,即打印到標(biāo)準(zhǔn)輸出。

pattern和{action}二者可以省略其中之一,但是不能兩者同時(shí)省略。pattern省略時(shí)表示不對(duì)任何行進(jìn)行過(guò)濾。

{action}中的語(yǔ)句之間,使用;進(jìn)行分隔,使用#進(jìn)行注釋。

-f progfile: 允許awk調(diào)用并執(zhí)行progfile文件。progfile必須是一個(gè)符合awk語(yǔ)法的文本文件。

in_file: awk的輸入文件。awk允許對(duì)多個(gè)輸入文件進(jìn)行處理,其間用,隔開(kāi),awk不會(huì)修改輸入文件。如果未指定輸入文件,awk將接受標(biāo)準(zhǔn)輸入,并將結(jié)果顯示在標(biāo)準(zhǔn)輸出。awk支持輸入輸出重定向。

四.記錄、字段和內(nèi)置變量

記錄和字段:在awk中,缺省情況下會(huì)將文本中的一行視為一個(gè)記錄,而將一行中的某一部分視作一個(gè)字段,這與數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)的處理方式類似。比如數(shù)據(jù)庫(kù)中某個(gè)數(shù)據(jù)表的第一個(gè)字段名叫做ID,第二個(gè)叫做Name,在awk中使用$1、$2表示第一個(gè)字段、第二個(gè)字段。特殊的,awk用$0來(lái)表示整個(gè)行(整條記錄)。

分隔符:不同的字段之間是用稱作分隔符的字符分隔開(kāi)的。系統(tǒng)默認(rèn)的分隔符是空格。awk允許在命令行中用-F re的形式來(lái)改變這個(gè)分隔符。事實(shí)上,awk用一個(gè)內(nèi)置的變量FS來(lái)記憶這個(gè)分隔符。

內(nèi)置變量:除了FS外,awk中有好幾個(gè)這樣的內(nèi)置變量,如記錄和記錄之間(行與行之間)的分隔符使用RS表示,當(dāng)前工作的記錄數(shù)為NR等等。這些內(nèi)置的變量可以在awk程序中引用或修改,例如,可以利用NR變量在模式匹配中指定工作范圍,也可以通過(guò)修改記錄分隔符RS讓一個(gè)特殊字符而不是換行符作為記錄的分隔符。例如,以下語(yǔ)句表示,顯示文本文件第7行到第15行中以%分給的第1、3、7個(gè)字段值。

awk -F % 'NR==7,NR==15 {printf $1 $3 $7}' testfile

awk的其他內(nèi)置變量:A=awk,N=nawk,P=POSIX awk。以下內(nèi)置變量以系統(tǒng)中的幫助為準(zhǔn)(不同系統(tǒng)下的awk可能有所出入)。

P ENVIRON UNIX環(huán)境變量
A FILENAME 當(dāng)前輸入文件的名字
P FNR 當(dāng)前記錄數(shù)
A FS 輸入字段分隔符 空格 
A NF 當(dāng)前記錄中的字段個(gè)數(shù)
A NR 已經(jīng)讀出的記錄數(shù)
A OFMT 數(shù)字的輸出格式 %.6g
A OFS 輸出字段分隔符 空格
A ORS 輸出的記錄分隔符 新行
A RS 輸入的記錄他隔符 新行

五.內(nèi)置函數(shù)

例:顯示文件myfile中的行號(hào)和第3字段:

$awk '{printf"%03d%s\n",NR,$1}' myfile

其中,printf即內(nèi)部函數(shù),該函數(shù)類似c++中的printf,可以對(duì)輸出格式進(jìn)行控制;

例:下面的示例顯示了內(nèi)置變量和內(nèi)置函數(shù)length()的使用:

$awk 'length($0)>80 {print NR}' myfile

該命令行將顯示文本myfile中所有超過(guò)80個(gè)字符的行號(hào),在這里,用$0表示整個(gè)記錄(行),同時(shí),內(nèi)置變量NR不使用標(biāo)志符'$'。

例:作為一個(gè)較為實(shí)際的例子,我們假設(shè)要對(duì)UNIX中的用戶進(jìn)行安全性檢查,方法是考察/etc下的passwd文件,檢查其中的passwd字段(第二字段)是否為"*",如不為"*",則表示該用戶沒(méi)有設(shè)置密碼,顯示出這些用戶名(第一字段)。我們可以用如下語(yǔ)句實(shí)現(xiàn):

#awk -F: '$2=="" {printf("%s no password!\n",$1' /etc/passwd

在這個(gè)示例中,passwd文件的字段分隔符是“:”,因此,必須用-F:來(lái)更改默認(rèn)的字段分隔符,這個(gè)示例中也涉及到了內(nèi)置函數(shù)printf的使用。

其他內(nèi)置函數(shù):(以自己系統(tǒng)中的幫助為準(zhǔn))

N gsub(reg,string,target) 每次常規(guī)表達(dá)式reg匹配時(shí)替換target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字符個(gè)數(shù)
N match(string,reg) 返回常規(guī)表達(dá)式reg匹配的string中的位置
N printf(format,variable) 格式化輸出,按format提供的格式輸出變量variable。
N split(string,store,delim) 根據(jù)分界符delim,分解string為store的數(shù)組元素
N sprintf(format,variable) 返回一個(gè)包含基于format的格式化數(shù)據(jù),variables是要放到串中的數(shù)據(jù)
G strftime(format,timestamp) 返回一個(gè)基于format的日期或者時(shí)間串,timestmp是systime()函數(shù)返回的時(shí)間
N sub(reg,string,target) 第一次當(dāng)常規(guī)表達(dá)式reg匹配,替換target串中的字符串
A substr(string,position,len) 返回一個(gè)以position開(kāi)始len個(gè)字符的子串
P totower(string) 返回string中對(duì)應(yīng)的小寫字符
P toupper(string) 返回string中對(duì)應(yīng)的大寫字符
A atan(x,y) x的余切(弧度)
N cos(x) x的余弦(弧度)
A exp(x) e的x冪
A int(x) x的整數(shù)部分
A log(x) x的自然對(duì)數(shù)值
N rand() 0-1之間的隨機(jī)數(shù)
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化隨機(jī)數(shù)發(fā)生器。如果忽略x,則使用system()
G system() 返回自1970年1月1日以來(lái)經(jīng)過(guò)的時(shí)間(按秒計(jì)算)

六.awk的自定義變量

awk允許用戶在awk程序語(yǔ)句中定義并調(diào)用自已的變量。當(dāng)然這種變量不能與內(nèi)置變量及其它awk保留字相同。與C語(yǔ)言不同的是,awk中不需要對(duì)變量進(jìn)行初始化,awk根據(jù)其在awk中第一次出現(xiàn)的形式和上下文確定其具體的數(shù)據(jù)類型。當(dāng)變量類型不確定時(shí),awk默認(rèn)其為字符串類型。這里有一個(gè)技巧:如果你要讓你的awk程序知道你所使用的變量的明確類型,你應(yīng)當(dāng)在在程序中給它賦初值。

舉例:

awk '[name=$1;pwd=$2;print $1,$2]'  user.log

說(shuō)明:上例中的name、pwd均為自定義變量,不需初始化,非常簡(jiǎn)便.

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多