AWK簡單例項

2021-03-31 08:56:57 字數 4271 閱讀 5524

摘自:http://bbs.xplore.**

awk是一種模式掃瞄合處理語言,其名稱來自最初的作者alfred v. aho,perter j. weinberger和brian w.kernighan的字母縮寫,最早的awk是在at&t的bell實驗室發明的。

linux下面使用的awk是gnu awk。

awk可以用來:

1.管理小型個人資料庫

2.產生報表

3.產生索引

。。。。

awk也是一種解釋性的語言,,我們主要使用它來編寫一些小的工具,解決某些大問題中的小問題,對於系統管理員而言特別有用。

下面以檔案test1.dat來舉例說明awk的一些簡單應用:

**::

cat test1.dat

one 123-321 234/22 a

two 344-637 726/28 c

three 273-287 287/97 d

four 872-872 282/20 c

上面是test1.dat的內容,中間用空白字元隔開(可以是空格,製表符等)

首先我們要弄清楚幾個概念:

1.記錄(record)

記錄是awk從資料檔案上讀取的資料的基本單位。對於test1.dat檔案而言,一條記錄就是一行。

第一條記錄:「one 123-321 234/22 a」

2.域(field)

域是為記錄上被分隔的子字串。以記錄「one 123-321 234/22 a」為例子

第一欄 第二欄 第三欄 第四欄

one 123-321 234/22 a

一幫以空白字元來分隔相鄰的域。

如果awk的程式很段,那麼就可以再命令列上直接輸入:

awk '程式' 檔案1,檔案2.。。。。

比如列印輸入檔案的第二列

**::

awk '' test1.dat

123-321

344-637

273-287

872-872

如果程式較長,那就寫入到乙個指令碼檔案中,執行awk的格式如下:

awk -f 程式檔名 檔案1,檔案2.。。。

這個和一般的shell指令碼不一樣,一般的shell指令碼自己把它看成可知行檔案來執行。

awk程式的檔案不止乙個時,執行awk的格式如下:

awk -f 程式檔案1 -f 程式檔案2 。。。 檔案1,檔案2.。。。。。

現在我們來看看awk程式的主要結構,awk程式中主要語法是表示式,因此一般的awk程式形式象下面這樣:

表示式1

表示式2

。。。

表示式n

awk也可以接受一般的關係判斷如

**::

>,<,>=,<=,==,!=

另外它還接受~(符合)及!~(不符合)兩個關係運算子,比如

**::

"xplore" ~/or/

這個上面這一行是乙個表示式,因為xplore中包含可符合/or/的子字串,顧該表示式返回true。

而動作是有許多awk指令構成。awk的指令合c語言的指令類似。比如:

awk的i/o指令:print,printf(),getline.....

awk 流程控制指令:if (..) else while(....) .....

乙個標準的awk程式分成三個部分:begin{},{},end{},其中begin{}部分是再程式開始時執行,不管是否有輸入,{}是輸入多少行,就執行多少行;end{}是在程式結束時執行,也只執行一次。

比如下面的程式.

**::

$cat count.awk

begin

end

$ awk -f count.awk test1.dat

now,begin statistic the lines of file

this is the 1 line

this is the 2 line

this is the 3 line

this is the 4 line

this is the end of file

再說一說有關awk的內部變數:

1.域變數

awk內部的域變數及其含義如下:

域變數 含義

$0 為一字串,其內容為目前awk所讀入的記錄

$1 代表$0上第乙個域的資料

$2 代表$0上第二個域的資料

......................

awk還提供了一些其他內部變數,常用的有:

nf(number of fields)為一整數,表示域的數目,比如test1.dat上域數目就是4個

nr(number of records)為一整數,其值表示awk意讀入的記錄條數

filename 正在處理的資料檔名

還有一些awk的內部函式,這些函式的用法和名稱和perl相識,因此這裡不詳細說明,在後面的例子中大家可以看到。

現舉出一些常用的例子,通過這些例項,會對awk語言有深一步的了解。

1.輸出所有輸入行之中,欄位的最大個數。

**::

$awk ' end ' test1.dat

42.將乙個檔案裡所有的空白行刪除

**::

$ awk 'nf>0' test1.dat

one 123-321 234/22 a

two 344-637 726/28 c

three 273-287 287/97 d

four 872-872 282/20 c

3.輸出乙個檔案的偶數行

**::

$ awk 'nr %2 ==0' test1.dat

two 344-637 726/28 c

four 872-872 282/20 c

4.輸入範圍是1到100的七個隨機數

**::

$ awk 'begin'

24 29

85 15

59 19

5.輸出本目錄下所有檔案的位元組數

**::

]$ ls -l |awk '; end'

15827

6.將系統上的所有使用者名稱,按照字母順序輸出

**::

$ awk 'begin ' /etc/passwd

adm

apache

bin

daemon

dbus

desktop

ftp

games

gdm

gopher

guest

halt

lp mail

mailnull

mlsx

mysql

news

nfsnobody

nobody

nscd

ntp

operator

pcap

plone

root

rpc

rpcuser

rpm

shutdown

**msp

squid

sshd

sync

uucp

vcsa

webalizer

wpm

xfs

7.統計乙個檔案的總行數並輸出

**::

$ awk 'end' test1.dat

total 4 lines

8.給檔案新增行數並輸出

**::

9.輸出檔案中包含『one』的行

**::

$ awk '/one/' test1.dat

one 123-321 234/22 a

10.給該系統上的正規使用者的郵箱列表(假設網域名稱是cie.xtu.edu.**)

**::

$ awk 'begin ' /etc/passwd

[email protected].**

[email protected].**

[email protected].**

[email protected].**

AWK使用例項

在awk中,可以用!a 0 做為 條件,對 重複出現 的行進行 處理。b ash 3.2 cat 2 abc abc ef 123 dgag 123 bash 3.2aw k a 0 2 abc ef 123 dgag 對於awk a 3 需要了解3個知識點 1 awk陣列知識,不說了 2 awk的...

awk 統計例項

個人比較懶,慢慢加了 一點一點重新做下記錄,時間久不用都忘記了 一 如 新建乙個a檔案,內容如下 1,5 1,2,3,4,5 1,2,3,4,5,1,5,5,5 1然後awk f end a 輸出為 1,2 1,52 第一列為1的出現4次,第五列為5 的出現2次 二 去除awk某列重複行 首先建立乙...

awk 陣列例項

awk 陣列例項 awk的陣列,一種關聯陣列 associative arrays 下標可以是數字和字串。因無需對陣列名和元素提前宣告,也無需指定元素個數 所以 awk的陣列使用非常靈活。首先介紹下幾個awk 1 建立陣列 array index value 陣列名 array 下標index 以及...