歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux文本處理工具之awk

Linux文本處理工具之awk

日期:2017/2/28 14:24:05   编辑:Linux教程

調用方式
1.命令行
awk [-F field-separator] 'commands' input-file(s)
commands是真正awk命令,[-F域分隔符]是可選的。input-file(s) 是待處理的文件。在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格(或者tab)。
2.shell腳本方式
將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,以便通過鍵入腳本名稱來調用。相當於shell腳本首行的:#!/bin/sh 可以換成:#!/bin/awk -f
3.將所有的awk命令插入一個單獨文件,然後調用:awk -f awk-script-file input-file(s)其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上面的是一樣的。
內置變量
ARGC:命令行參數個數
ARGV:命令行參數排列
ENVIRON:UNIX環境變量
ERRNO:UNIX系統錯誤消息
FILENAME:awk浏覽的文件名
OFMT:數字的輸出格式 %.6g
FNR:浏覽文件的記錄數
FS:設置輸入域分隔符,等價於命令行 -F選項
NF:浏覽記錄的域的個數
NR:已讀的記錄數,就是行號,從1開始
FNR:當前記錄數
OFS:輸出域分隔符
ORS:輸出記錄分隔符
RS:控制記錄分隔符
$0:當前記錄(作為單個變量)
$1~$n:當前記錄的第n個字段,字段間由FS分隔
輸出函數
print:參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這裡,逗號的作用與輸出文件的分隔符的作用是一樣的,只是後者是空格而已
printf:其用法和c語言中printf基本相似,可以格式化字符串,輸出復雜時,printf更加好用,代碼更易懂。具體格式如下:
%d 十進制有符號整數
%u 十進制無符號整數
%f 浮點數
%s 字符串
%c 單個字符
%p 指針的值
%e 指數形式的浮點數
%x %X 無符號以十六進制表示的整數
%o 無符號以八進制表示的整數
%g 自動選擇合適的表示法
獲取外部變量
1.獲取普通外部變量
awk ‘{action}’ 變量名=變量值
2.BEGIN程序塊中變量
awk –v 變量名=變量值 [–v 變量2=值2 …] 'BEGIN{action}’
3.環境變量
需要用到內置變量ENVIRON實現
運算符
1.賦值運算符
= += -= *= /= %= ^= **=
2.邏輯運算符
||:邏輯或
&&:邏輯與
3.正則運算符
~:匹配正則表達式
~!:不匹配正則表達式
4.關系運算符
< <= > >= != ==
5.算術運算符
+ - * / & ++ --
6.其它運算符
$:字段引用
空格:字符串連接符
?:C條件表達式
in:數組中是否存在某鍵值
字符操作
1.字符串轉數字
將變量通過”+”連接運算。自動強制將字符串轉為整型。非數字變成0,發現第一個非數字字符,後面自動忽略
2.數字轉字符串
只需要將變量與””符號連接起來運算即可
3.字符串連接
只需要將變量與””符號連接起來運算即可
數組操作
在awk中數組叫做關聯數組,因為下標既可以是數也可以是串。awk中的數組不必提前聲明,也不必聲明大小。數組元素用0或空串來初始化,這根據上下文而定。需要注意的是不同版本下面函數不一定相同。其相關的函數有length、asort、delete、split。當然也可以實現多維數組。
流程控制語句
1.條件判斷語句(if)
if(表達式){語句1}else{語句2}
if(表達式){語句1}else if(表達式){語句2}else{語句3}
2.循環語句(while、for、do while)
while(表達式){語句}
for(變量 in 數組){語句}
for(變量;條件;表達式){語句}
do{語句}while(條件)
3.關鍵字
break:當break語句用於while或for語句時,導致退出程序循環。
continue:當continue語句用於while或for語句時,使程序循環移動到下一個迭代。
next:能能夠導致讀入下一個輸入行,並返回到腳本的頂部。這可以避免對當前輸入行執行其他的操作過程。
exit:語句使主輸入循環退出並將控制轉移到END,如果END存在的話。如果沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。
正則表達式
+:包含一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行:awk '/smith+ern/' testfile
?:包含零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行:awk '/smith?/' testfile
|:以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行:awk '/allen | alan /' testfile
():在正則表達式中將字符串組合在一起。命令行:awk '/a(ll)?/' testfile
{m}:有m個模式的具體值位於字符串中,則字符串匹配。命令行:awk '/l{2}/' testfile
{m,}:至少m個模式的具體值在字符串中,則字符串匹配。命令行:awk '/t{2,}/' testfile
{m, n}:在m和n之間(包含的m和n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行:awk '/er{1, 2}/' testfile
[String]:正則表達式與方括號內String變量指定的任何字符匹配。命令行:awk '/sm[a-h]/' testfile
[^ String]:在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內的任何字符不匹配。這樣,命令行:awk '/sm[^a-h]/' testfile
~,!~:表示指定變量與正則表達式匹配或不匹配的條件語句。命令行:awk '$1 ~ /n/' testfile
^:指定字段或記錄的開頭。命令行:awk '$2 ~ /^h/' testfile
$:指定字段或記錄的末尾。命令行:awk '$2 ~ /y$/' testfile
.:表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行:awk '/a..e/' testfile
\ :轉義字符。當位於在擴展正則表達式中具有特殊含義的任何字符之前時,轉義字符除去該字符的任何特殊含義。例如,命令行:/a\/\//
內置函數
1.算術函數
atan2( y, x ) 返回 y/x 的反正切。
cos( x ) 返回 x 的余弦;x 是弧度。
sin( x ) 返回 x 的正弦;x 是弧度。
exp( x ) 返回 x 冪函數。
log( x ) 返回 x 的自然對數。
sqrt( x ) 返回 x 平方根。
int( x ) 返回 x 的截斷至整數的值。
rand( ) 返回任意數字 n,其中 0 <= n < 1。
srand( [Expr] ) 將 rand 函數的種子值設置為 Expr 參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。
2.字符串函數
gsub( Ere, Repl, [ In ] ) 除了正則表達式所有具體值被替代這點,它和 sub 函數完全一樣地執行,。
sub( Ere, Repl, [ In ] ) 用 Repl 參數指定的字符串替換 In 參數指定的字符串中的由 Ere 參數指定的擴展正則表達式的第一個具體值。sub 函數返回替換的數量。出現在 Repl 參數指定的字符串中的 &(和符號)由 In 參數指定的與 Ere 參數的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數,缺省值是整個記錄($0 記錄變量)。
index( String1, String2 ) 在由 String1 參數指定的字符串(其中有出現 String2 指定的參數)中,返回位置,從 1 開始編號。如果 String2 參數不在 String1 參數中出現,則返回 0(零)。
length [(String)] 返回 String 參數指定的字符串的長度(字符形式)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。
blength [(String)] 返回 String 參數指定的字符串的長度(以字節為單位)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。
substr( String, M, [ N ] ) 返回具有 N 參數指定的字符數量子串。子串從 String 參數指定的字符串取得,其字符以 M 參數指定的位置開始。M 參數指定為將 String 參數中的第一個字符作為編號 1。如果未指定 N 參數,則子串的長度將是 M 參數指定的位置到 String 參數的末尾 的長度。
match( String, Ere ) 在 String 參數指定的字符串(Ere 參數指定的擴展正則表達式出現在其中)中返回位置(字符形式),從 1 開始編號,或如果 Ere 參數不出現,則返回 0(零)。RSTART 特殊變量設置為返回值。RLENGTH 特殊變量設置為匹配的字符串的長度,或如果未找到任何匹配,則設置為 -1(負一)。
split( String, A, [Ere] ) 將 String 參數指定的參數分割為數組元素 A[1], A[2], . . ., A[n],並返回 n 變量的值。此分隔可以通過 Ere 參數指定的擴展正則表達式進行,或用當前字段分隔符(FS 特殊變量)來進行(如果沒有給出 Ere 參數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 數組中的元素用字符串值來創建。
tolower( String ) 返回 String 參數指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。
toupper( String ) 返回 String 參數指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。
sprintf(Format, Expr, Expr, . . . ) 根據 Format 參數指定的 printf 子例程格式字符串來格式化 Expr 參數指定的表達式並返回最後生成的字符串。
3.時間函數
mktime( YYYY MM DD HH MM SS[ DST]) 生成時間格式
strftime([format [, timestamp]]) 格式化時間輸出,將時間戳轉為時間字符串,具體格式如下:
%a 星期幾的縮寫(Sun)
%A 星期幾的完整寫法(Sunday)
%b 月名的縮寫(Oct)
%B 月名的完整寫法(October)
%c 本地日期和時間
%d 十進制日期
%D 日期 08/20/99
%e 日期,如果只有一位會補上一個空格
%H 用十進制表示24小時格式的小時
%I 用十進制表示12小時格式的小時
%j 從1月1日起一年中的第幾天
%m 十進制表示的月份
%M 十進制表示的分鐘
%p 12小時表示法(AM/PM)
%S 十進制表示的秒
%U 十進制表示的一年中的第幾個星期(星期天作為一個星期的開始)
%w 十進制表示的星期幾(星期天是0)
%W 十進制表示的一年中的第幾個星期(星期一作為一個星期的開始)
%x 重新設置本地日期(08/20/99)
%X 重新設置本地時間(12:00:00)
%y 兩位數字表示的年(99)
%Y 當前月份
%Z 時區(PDT)
%% 百分號(%)
systime() 得到時間戳,返回從1970年1月1日開始到當前時間(不計閏年)的整秒數
4.其他函數
close( Expression ) 用同一個帶字符串值的 Expression 參數來關閉由 print 或 printf 語句打開的或調用 getline 函數打開的文件或管道。如果文件或管道成功關閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,並稍後在同一個程序中讀取文件,則 close 語句是必需的。
system(Command ) 執行 Command 參數指定的命令,並返回退出狀態。等同於 system 子例程。
Expression | getline [ Variable ] 從來自 Expression 參數指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,並將該記錄的值指定給 Variable 參數指定的變量。如果當前未打開將 Expression 參數的值作為其命令名稱的流,則創建流。創建的流等同於調用 popen 子例程,此時 Command 參數取 Expression 參數的值且 Mode 參數設置為一個是 r 的值。只要流保留打開且 Expression 參數求得同一個字符串,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。
getline [ Variable ] < Expression 從 Expression 參數指定的文件讀取輸入的下一個記錄,並將 Variable 參數指定的變量設置為該記錄的值。只要流保留打開且 Expression 參數對同一個字符串求值,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。
getline [ Variable ] 將 Variable 參數指定的變量設置為從當前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 參數,則 $0 記錄變量設置為該記錄的值,還將設置 NF、NR 和 FNR 特殊變量。
5.排序函數
asort:對數組的值進行排序,並且會丟掉原先鍵值;
asorti:對數組的下標進行排序。

例如
1.內置變量
a.$0
awk '/^root/{print $0}' /etc/passwd #/^root/為選擇表達式,$0代表是逐行
b.設置字段分隔符號(FS)
awk 'BEGIN {FS=":"} /^root/ {print $1, NF}' /etc/passwd #FS為字段分隔符,可以自己設置,默認是空格,因為passwd裡面是”:”分隔,所以需要修改默認分隔符。NF是字段總數,$0代表當前行記錄,$1-$n是當前行,各個字段對應值。
c.記錄條數(NR、FNR)
awk 'BEGIN {FS=":"} {print NR, $1, FNR}' /etc/passwd #NR得到當前記錄所在行
d.設置輸出字段分隔符(OFS)
awk 'BEGIN {FS=":"; OFS="~~"} /^root/ {print FNR, $1, $NF}' /etc/passwd #OFS設置默認字段分隔符
e.設置輸出行記錄分隔符(ORS)
awk 'BEGIN {FS=":"; ORS="~~"} {print FNR, $1, $NF}' #ORS默認是換行符,這裡修改為:”~~”,所有行之間用”~~”分隔了
f.輸入參數獲取(ARGC,ARGV)
awk 'BEGIN {FS=":"; print "ARGC="ARGC; for (k in ARGV) {print k"="ARGV[k];}}' /etc/passwd #ARGC得到所有輸入參數個數,ARGV獲得輸入參數內容,是一個數組
g.獲得傳入的文件名(FILENAME)
awk 'BEGIN {FS=":"; print FILENAME} {print FILENAME}' /etc/passwd #FILENAME,$0-$N,NF 不能使用在BEGIN中,BEGIN中不能獲得任何與文件記錄操作的變量。
h.獲得linux環境變量(ENVIRON)
awk 'BEGIN {print ENVIRON["PATH"];}' /etc/passwd #ENVIRON是子典型數組,可以通過對應鍵值獲得它的值。
i.輸出數據格式設置(OFMT)
awk 'BEGIN {OFMT="%.3f"; print 2/3,123.11111111;}' /etc/passwd #OFMT默認輸出格式是:%.6g 保留六位小數,這裡修改OFMT會修改默認數據輸出格式
j.按寬度指定分隔符
echo 20100117054932 | awk 'BEGIN {FIELDWIDTHS="4 2 2 2 2 3"} {print $1"-"$2"-"$3,$4":"$5":"$6}' #FIELDWIDTHS其格式為空格分隔的一串數字,用以對記錄進行域的分隔,FIELDWIDTHS="4 2 2 2 2 2"就表示$1寬度是4,$2是2,$3是2 .... 。這個時候會忽略:FS分隔符
k.RSTART RLENGTH
awk 'BEGIN{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
awk 'BEGIN{start=match("this is a test",/^[a-z]+$/); print start, RSTART, RLENGTH }' #RSTART被匹配正則表達式首位置,RLENGTH匹配字符長度,沒有找到為-1.
2.獲取外部變量
a.獲取普通的外部變量
test='awk code'
echo | awk '{print test}' test="$test"
echo | wawk 'BEGIN {print test}' test="$test" #傳入的變量可以在action中獲取值,但是變量名與值放到'{action}'後邊。其中BEGIN的action是不能獲得
b.BEGIN程序塊的變量
test='awk code'
echo | awk -v test="$test" 'BEGIN {print test}'
echo | awk -v test="$test" '{print test}' #用-v 傳入變量可以在3中類型的action 中都可以獲得到,但順序在 action前面
c.獲得環境變量
awk 'BEGIN {for (i in ENVIRON) {print i"="ENVIRON[i];}}'
3.運算符
a.賦值運算符、算術運算
echo | awk 'BEGIN {a=1; b=5; c=3} {a+=5; b++; c--} END {print a, b, c, a*b}'
b.邏輯運算符
awk 'BEGIN {a=1; b=2; print (a>5 && b<=2),(a>5 || b<=2);}'
c.關系運算符
awk 'BEGIN{a="11";if(a >= 9){print "ok";}}' #> < 可以作為字符串比較,也可以用作數值比較,關鍵看操作數如果是字符串 就會轉換為字符串比較。兩個都為數字 才轉為數值比較。字符串比較:按照ascii碼順序比較
d.其它運算符
awk 'BEGIN {a="b"; print a=="b" ? "ok" : "err";}' #三目運算
awk 'BEGIN {a="b"; arr[0]="b"; arr[1]="c"; print (a in arr);}' #判斷數組中是否存在該鍵值
3.字符操作
a.字符串轉數字
awk 'BEGIN {a="100"; b="10test10"; print (a+b+0);}'
awk 'BEGIN {a="100"; b="10test10"; print a+b+0;}'
b.數字轉字符串
awk 'BEGIN {a=100; b=100; c=(a""b); print c}'
awk 'BEGIN {a=100; b=100; c=a""b; print c}'
c.字符串連接
awk 'BEGIN {a="a"; b="b"; c=a""b; print c}'
3.數組操作
a.賦值
awk 'BEGIN {tB["a"]="a1"; tB["b"]=1;}'
b.數組長度(length)
awk 'BEGIN {tB["a"]="a1"; tB["b"]=1; print length(tB)}'
awk 'BEGIN {info="it is a test"; split(info,tA," "); print asort(tA);}' #asort對數組進行排序,返回數組長度
c.字符串分割為數組(split)
awk 'BEGIN {info="it is a test"; lens=split(info,tA," "); print length(tA), lens;}' #length返回字符串以及數組長度,split進行分割字符串為數組,也會返回分割得到數組長度
d.數組輸出
awk 'BEGIN {info="it is a test"; split(info,tA," "); for(k in tA){print k, tA[k];}}' #for…in 輸出,因為數組是關聯數組,默認是無序的。
awk 'BEGIN {info="it is a test"; tlen=split(info,tA," "); for(k=1; k<=tlen; k++){print k, tA[k];}}' #如果需要得到有序數組,需要通過下標獲得。數組下標是從1開始,與c數組不一樣
e.判斷鍵值是否存在
awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if(tB["c"]!="1"){print "no found";}; for(k in tB){print k,tB[k];}}' #tB[“c”]沒有定義,但是循環時候,發現已經存在該鍵值,它的值為空,這裡需要注意,awk數組是關聯數組,只要通過數組引用它的key,就會自動創建改序列
awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; if( "c" in tB){print "ok";}; for(k in tB){print k,tB[k];}}' #if(key in array) 通過這種方法判斷數組中是否包含”key”鍵值,才能正確的判斷
f.刪除鍵值
awk 'BEGIN {tB["a"]="a1"; tB["b"]="b1"; delete tB["a"]; for(k in tB){print k, tB[k];}}'
g.二維數組
awk 'BEGIN{
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
tarr[i,j]=i*j;
print i,"*",j,"=",tarr[i,j];
}
}
}'
#array[k,k2]引用獲得數組內容
4.流程控制操作
a.awk 'BEGIN{
score=100;
if(score>90)
{
print "優秀";
}
else if(score>80)
{
print "良好";
}
else if(score>70)
{
print "普通";
}
else if(score>60)
{
print "及格";
}else
{
print "不及格";
}
}'
b.awk 'BEGIN{
total=0;
while(i<=100)
{
total+=i;
i++;
}
print total;
}'
c.awk 'BEGIN{
for(k in ENVIRON)
{
print k"="ENVIRON[k];
}
}' #ENVIRON是awk常量,是數組
d.awk 'BEGIN{
total=0;
for(i=0;i<=100;i++)
{
total+=i;
}
print total;
}'
e.awk 'BEGIN{
total=0;
i=0;
do
{
total+=i;
i++;
}while(i<=100)
print total;
}'
5.內置函數
a.算術函數
awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' #OFMT 設置輸出數據格式是保留3位小數
awk 'BEGIN{srand();fr=int(100*rand());print fr;}' #獲得隨機數
b.字符串函數
awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' #在 info中查找滿足正則表達式,/[0-9]+/ 用””替換,並且替換後的值,賦值給info 未給info值,默認是$0
awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}'
awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}' #正則匹配
awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' #從第 4個 字符開始,截取10個長度字符串
awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' #分割info,動態創建數組tA
c.時間函數
awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}'
awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' #求2個時間段中間時間差
d.其他函數
awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' #打開外部文件
awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' #逐行讀取外部文件
awk 'BEGIN{print "Enter your name:";getline name;print name;}'
awk 'BEGIN{b=system("ls -al");print b;}' #調用外部應用程序
6.輸出函數
a.printf
awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o\n",n1,n2,n3,n1,n1);}' #類似於C語音
7.awk腳本
#!/bin/awk -f
BEGIN{
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
tarr[i,j]=i*j;
print i,"*",j,"=",tarr[i,j];
}
}
}

注意
1.在awk中有兩個特別的表達式,BEGIN和END,這兩者都可用於pattern中,提供BEGIN和END的作用是給程序賦予初始狀態和程序結束之後執行一些掃尾的工作。任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後的操作將在掃描完全部的輸入之後執行。因此通常BEGIN來顯示變量和初始化變量,使用END來輸出最終結果。
2.awk中數據類型,是不需要定義,自適應的。 有時候需要通過(+、"")強制轉換。
3.awk數組下標是從1開始,與c數組不一樣。
4.awk的多維數組在本質上是一維數組,更確切一點,awk在存儲上並不支持多維數組。awk提供了邏輯上模擬二維數組的訪問方式。例 如,array[2,4] = 1這樣的訪問是允許的。awk使用一個特殊的字符串SUBSEP (\034)作為分割字段,在上面的例子中,關聯數組array存儲的鍵值實際上是2\0344。多維數組可以使用if((i,j) in array)這樣的語法,但是下標必須放置在圓括號中。多維數組使用 for ( item in array )這樣的語法遍歷數組。與一維數組不同的是,多維數組必須使用split()函數來訪問單獨的下標分量。split ( item, subscr, SUBSEP)
5.awk實現的性能是比shell實現的強

--------------------------------------分割線 --------------------------------------

AWK簡介及使用實例 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell腳本之AWK文本編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正則表達式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文本數據處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文本分析工具-awk http://www.linuxidc.com/Linux/2014-12/110939.htm

--------------------------------------分割線 --------------------------------------

Copyright © Linux教程網 All Rights Reserved