AWK用法簡介
AWK用法簡介
AWK 用法簡介
概要
AWK是Unix平臺上一種可以對文字進行逐行處理的程式語言,它來源於3個創作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan. 與sed和grep很相似,awk是一種樣式掃描與處理工具,但其功能卻大大強於sed和grep。awk提供了極其強大的功能:它幾乎可以完成grep和sed所能完成的全部工作,同時,它還可以可以進行樣式裝入、流控制、數學運算子、程式控制語句甚至於內建的變數和函式。awk的三位建立者已將它正式定義為:樣式掃描和處理語言。
AWK的呼叫方式
1). 程式體直接寫到AWK命令列中,適用較簡單的情況
awk
'program' input-file1 input-file2 ...
2). 程式體寫入檔案中,用AWK命令呼叫該檔案
awk -f program-file
input-file1 input-file2 ...
3). C shell作為命令解釋程式,呼叫AWK來執行AWK程式,寫成的指令碼
#!/bin/csh
-f
awk '
{ print
$8, "t", $3}
'
4). AWK作為命令解釋程式,寫成的指令碼
#!/bin/awk
-f
{ print
$8, "t", $3}
AWK的引數說明
awk [ -F re] [parameter...]
['prog'] [-f progfile][in_file...]
引數說明:
-F re: 允許awk更改其欄位分隔符。
parameter: 該引數幫助為不同的變數賦值。
'prog': awk的程式語句段。必須用單引號:'和'括起,以防被shell解釋。
這個程式語句段的標準形式為: 'pattern
{action}'
(1) pattern引數是匹配模式,跟Sed命令類似。
(2) action引數總是被大括號包圍,由一系統awk語句組成,各語句間用";"分隔。
awk在pattern給定的樣式匹配記錄上執行其操作。 使用“#”作為註釋符。
(3) 可以省略pattern和action之一,但不能兩者同時省略,當省略pattern時沒
有樣式匹配,表示對所有行(記錄)均執行操作,省略action時執行預設的操作—在標準輸出上顯示。
(4) 可以包含多個pattern {action},如果一個記錄滿足多個pattern,其對應的action會被執行多次
-f progfile: 允許awk呼叫執行程式檔案。progfile是一文字檔案,必須符合awk語法。
in_file: awk的輸入檔案,awk允許對多個輸入檔案進行處理。
*awk不修改輸入檔案。如果未指定輸入檔案,awk將接受標準輸入,並將結果顯示在標準輸出上。awk支援輸入輸出重定向。(跟SED類似)
AWK的記錄(Record)與欄位(Field)
awk處理的工作與資料庫的處理方式有相同之處,其相同處之一就是awk支援對記錄和欄位的處理,其中對欄位的處理是grep和sed不能實現的。在awk中,預設的情況下總是將文字檔案中的一行視為一個記錄,而將一行中的某一部分作為記錄中的一個欄位。為了操作這些不同的欄位,awk借用shell的方法,用$1,$2,$3...這樣的方式來順序地表示行(記錄)中的不同欄位。特殊地,awk用$0表示整個行(記錄)。不同的欄位之間是用稱作分隔符的字元分隔開的。系統預設的分隔符是空格。awk允許在命令列中用-F re的形式來改變這個分隔符。事實上,awk用一個內建的變數FS來記憶這個分隔符,可以在程式中進行修改。
AWK的運算,判斷與賦值
運算
運算子 用途
------------------
x^y x的y次冪
x**y 同上
x%y 計算x/y的餘數(求模)
x+y x加y
x-y x減y
x*y x乘y
x/y x除y
-y 負y(y的開關符號);也稱一目減
++y y加1後使用y(前置加)
y++ 使用y值後加1(字尾加)
--y y減1後使用y(前置減)
y-- 使用後y減1(字尾減)
x=y 將y的值賦給x
x+=y 將x+y的值賦給x
x-=y 將x-y的值賦給x
x*=y x*y的值賦給x
x/=y 將x/y的值賦給x x%=y 將x%y的值賦給x
x^=y 將x^y的值賦給x
x**=y 將x**y的值賦給x
判斷:
運算子 含義
x==y x等於y
x!=y x不等於y
x>y x大於y
x>=y x大於或等於y
x
x<=y x小於或等於y?
x~re x匹配正規表示式re?
x!~re x不匹配正規表示式re?
賦值 (按優先順序升序排列)
= 、+=、 -=、 *= 、/= 、 %=
||
&&
> >= < <= == != ~ !~
xy (字串連結,'x''y'變成"xy")
+ -
* / %
++ - -
AWK的流程控制
1、BEGIN和END:
在awk中兩個特別的表示式,BEGIN和END,這兩者都可用於pattern中,提供BEGIN和END的作用是給程式賦予初始狀態和在程式結束之後執行一些掃尾的工作。任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完所有輸入之後執行。因此,通常用BEGIN來顯示變數和預置(初始化)變數,用END來輸出最終結果。 例:累計銷售檔案xs中的銷售金額(假設銷售金額在記錄的第三欄位):
$awk
>'BEGIN { FS=":";print
"統計銷售金額";total=0}
>{print $3;total=total+$3;}
>END {printf "銷售金額總計:%.2f",total}' sx
>是shell提供的第二提示符,如要在shell程式awk語句和awk語言中換行,在行尾加反斜槓
在這裡,BEGIN預置了內部變數FS(欄位分隔符)和自定義變數total,同時在掃描之前顯示出輸出行頭。而END則在掃描完成後列印出總合計。
2、流程控制語句
2.1、if...else語句:
if(表示式)
語句1
else
語句2
格式中"語句1"可以是多個語句,如果你為了方便awk判斷也方便你自已閱讀,你最好將多個語句用{}括起來。awk分枝結構允許巢狀。
2.2、while語句
while(表示式語句
2.3、do-while語句
do
{
語句
}while(條件判斷語句)
2.4、for語句
for(初始表示式;終止條件;步長表示式)
{語句}
while、do-while和for語句中允許使用break, continue,exit來控制程式走向。
Break:中斷當前正在執行的迴圈並跳到迴圈外執行下一條語句。
Continue:從當前位置跳到迴圈開始處執行。
Exit:當exit語句不在END中時,該命令表現得如同到了檔案尾,所有模式或操作將停止,END模式中的操作被執行。而出現在END中的exit將導致程式終止。
AWK的變數
awk提供兩種變數,一種是awk內建的變數,在awk程式中引用內建變數不需要使用標誌符"$"awk提供的另一種變數是自定義變數。當然這種變數不能與內建變數及其它awk保留字相同,在awk中引用自定義變數必須在它前面加上標誌符"$"。與C語言不同的是,awk中不需要對變數進行初始化,awk根據其在awk中第一次出現的形式和上下文確定其具體的資料型別。當變數型別不確定時,awk預設其為字串型別。這裡有一個技巧:如果你要讓你的awk程式知道你所使用的變數的明確型別,你應當在在程式中給它賦初值。
AWK中的函式
AWK的函式同樣包括內建函式和使用者自定義的函式。原始的awk不提供函式功能,只有在nawk或較新的awk版本中才可以增加函式。
函式的使用包含兩部分:函式的定義與函式呼叫。其中函式定義又包括要執行的程式碼(函式本身)和從主程式程式碼傳遞到該函式的臨時呼叫。
awk函式的定義方法如下:
function 函式名(參數列){
函式體
}
函式名必須是一個合法的標誌符,參數列中可以不提供引數(但在呼叫函式時函式名後的一對括號仍然是不可缺少的),也可以提供一個或多個引數。awk的引數也是透過值來傳遞的。
在awk中呼叫函式比較簡單,其方法與C語言相似,但awk比C語言更為靈活,它不執行引數有效性檢查。換句話說,在你呼叫函式時,可以列出比函式預計(函式定義中規定)的多或少的引數,多餘的引數會被awk所忽略,而不足的引數,awk將它們置為預設值0或空字串,具體置為何值,將取決於引數的使用方式。
awk函式有兩種返回方式:隱式返回和顯式返回。當awk執行到函式的結尾時,它自動地返回到呼叫程式,這是函式是隱式返回的。如果需要在結束之前退出函式,可以明確地使用返回語句提前退出。方法是在函式中使用形如:return
返回值 格式的語句。
例:下面的例子演示了函式的使用。
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file,pageno);span lang="EN-US" style="">#呼叫函式print_header
>printf("當前頁頁號是:%dn",pageno);
}
#定義函式print_header
function
print_header(FileName,PageNum){
printf("%s
%dn",FileName,PageNum); >PageNum++;return PageNUm;
}
}' myfile
AWK的內建變數(預定義變數)
說明:表中v項表示第一個支援變數的工具:A=awk,N=nawk,P=POSIX awk,G=gawk
V 變數 含義 預設值
--------------------------------------------------------
N ARGC 命令列引數個數
G ARGIND 當前被處理檔案的ARGV標誌符
N ARGV 命令列引數陣列
G CONVFMT 數字轉換格式 %.6g
P ENVIRON UNIX環境變數
N ERRNO UNIX系統錯誤訊息
G FIELDWIDTHS 輸入欄位寬度的空白分隔字串
A FILENAME 當前輸入檔案的名字
P FNR 當前記錄數
A FS 輸入欄位分隔符 空格
G IGNORECASE 控制大小寫敏感0(大小寫敏感)
A NF 當前記錄中的欄位個數
A NR 已經讀出的記錄數
A OFMT 數字的輸出格式 %.6g
A OFS 輸出欄位分隔符 空格
A ORS 輸出的記錄分隔符 新行
A RS 輸入的記錄他隔符 新行
N RSTART 被匹配函式匹配的字串首
N RLENGTH 被匹配函式匹配的字串長度
N SUBSEP 下標分隔符
"34"
AWK的內建函式
V 函式 用途或返回值
------------------------------------------------
N gsub(reg,string,target) 每次常規表示式reg匹配時替換target中的string
N index(search,string) 返回string中search串的位置
A length(string) 求串string中的字元個數
N match(string,reg) 返回常規表示式reg匹配的string中的位置
N printf(format,variable) 格式化輸出,按format提供的格式輸出變數variable。
N split(string,store,delim) 根據分界符delim,分解string為store的陣列元素
N sprintf(format,variable) 返回包含基於format的格式化資料,variables是要放到串中的資料
G strftime(format,timestamp) 返回format日期或時間串,timestmp是systime()函式返回的時間
N sub(reg,string,target) 第一次當常規表示式reg匹配,替換target串中的字串
A substr(string,position,len) 返回一個以position開始len個字元的子串
P totower(string) 返回string中對應的小寫字元
P toupper(string) 返回string中對應的大寫字元
A atan(x,y) x的餘切
N cos(x) x的餘弦(弧度)
A exp(x) e的x冪
A int(x) x的整數部分
A log(x) x的自然對數值
N rand() 0-1之間的隨機數
N sin(x) x的正弦(弧度)
A sqrt(x) x的平方根
A srand(x) 初始化隨機數發生器。如果忽略x,則使用system()
G system() 返回自1970年1月1日以來經過的時間(按秒計算)
一些例子:
1. 列印11月被修改的檔案的位元組數
ls –lg | awk ‘$6 == “NOV” {sum += $5} END {print sum}’
2. 檔案result中包含FAILED的行數
awk ‘/FAILED/ {sum += 1} END {print sum}’ result
3. 列印file檔案最長行的長度
awk ‘if (length($0) > max) max = length($0)} END {print max}’ file
4. 輸出file檔案的行數
awk ‘END {print NR} file
NR是內建變數,表示已經讀出的記錄數,在END後輸出即是總行數
用cat file | wc –l 命令組合可以完成同樣的功能[@more@]
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70612/viewspace-1016024/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AWK簡介及使用例項
- expdp 的用法簡介
- linux之awk用法Linux
- awk命令部分用法
- awk sed 用法詳解
- AWK if(條件)語句與迴圈簡介
- Hbase簡介和基本用法
- mysqladmin的用法簡介MySql
- Oracle Scheduler(1)用法簡介Oracle
- start with ... connect by用法簡介
- InfluxDB簡介與php用法UXPHP
- jQuery filter() 用法簡單介紹jQueryFilter
- javascript的this用法簡單介紹JavaScript
- js WebSocket用法簡單介紹JSWeb
- javascript arguments用法簡單介紹JavaScript
- onerror事件用法簡單介紹Error事件
- jquery黏貼事件用法簡介jQuery事件
- IOS中 Block簡介與用法iOSBloC
- Shell中Read用法簡介
- HP_UX Glance用法簡介UX
- AWK 簡明教程
- <input type="number" >用法簡單介紹
- css 註釋用法簡單介紹CSS
- style.cssText用法簡單介紹CSS
- javascript with()語句用法簡單介紹JavaScript
- display:table-cell的用法簡介
- outerHTML屬性用法簡單介紹HTML
- JSON簡介以及用法彙總JSON
- 【python】os模組 的用法簡介Python
- xml schema 中elementFormDefault 的用法簡介XMLORM
- IOS中 Block簡介與用法(一)iOSBloC
- AWK 陣列介紹陣列
- awk sub和gsub區別及用法
- linux命令下jq的用法簡介Linux
- angularJS的router用法簡單介紹AngularJS
- CSS3 calc()用法簡單介紹CSSS3
- javascript innerText屬性用法簡單介紹JavaScript
- javascript call()函式用法簡單介紹JavaScript函式