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