參考:http://www.zsythink.net/archives/tag/awk/
一. 命令awk簡介
1. awk是一種編程語言,用於對文本和數據進行處理的
2. 具有強大的文本格式化能力
3. 利用命令awk,可以將一些文本整理成為我們想要的樣子
4. 命令awk是逐行進行處理的
二. grep、sed、awk的簡單比較
1. 命令grep,更適合單純的查找或匹配文本
2. 命令sed,更適合對匹配到的文本進行編輯
3. 命令awk,更適合文本格式化,對文本進行較復雜的格式處理
三. 命令awk基本語法
awk [options] 'pattern{action}' file
1. 在沒有options和pattern的情況下,使用命令awk

2. pattern包括兩種特殊模式,分別是BEGIN和END
(1)BEGIN模式,是指命令在處理文本之前執行

(2)END模式,是指命令在處理文本之后執行

(3)BEGIN模式和END模式同時存在時,其中,BEGIN與END之間的{}相當於一個循環體,對文件中的每一行進行處理

3. 常用的參數
(1)-F,用於指定輸入分隔符

(2)-v,用於設置變量的值


從文件中輸入變量

四. 變量
awk中的變量分為內置變量和自定義變量兩種
1. 內置變量
| FS | 輸入字段分隔符,默認為空白字符 |
| OFS | 輸出字段分隔符,默認為空白字符 |
| RS | 輸入記錄分隔符(輸入換行符),指定輸入時的換行符 |
| ORS | 輸出記錄分隔符(輸出換行符),指定輸出時的換行符 |
| NF | 當前行的字段數(當前行被分隔符分割成了幾段) |
| NR | 當前行的行號 |
| FNR | 不同文件分別計數 |
| FILENAME | 當前文件名 |
| ARGV | 數組,保存的是命令行所給定的各參數 |
| ARGC | ARGC數組的個數 |
(1)FS:以“:”為字段輸入分隔符,輸出第1列和第2列
1)使用-F選項指定輸入分隔符

2)使用內置變量FS指定輸入分隔符,需要注意的是,使用變量時,要使用-v選項來指定對應的變量

(2)OFS:以“#”為字段輸出分隔符,輸出第1列和第2列

(3)RS:以“:”為行輸入分隔符,輸出對應的行號和當前行內容。
需要注意的是,兩個紅框中的內容,由於Jack和DEF、Alice和GHI之間沒有“:”,所以在awk中被認作為同一行

(4)ORS:以“---”為行輸出分隔符

(5)NF:當前行的字段數
其中,$NF表示的是最后一個字段的內容,$(NF-1)表示的是倒數第二個字段的內容
(6)NR:當前行號
(7)FNR:不同文件分別計數

(8)FILENAME:顯示當前行的文件名

(9)ARGV:數組,保存的是命令行所給定的各參數

(10)ARGC:保存的是ARGV數組的個數

2. 自定義變量
(1)使用-v來自定義變量(在上第三節已介紹)
(2)在awk中直接定義

五. 格式化中,awk使用printf時需要注意的問題
1. 使用printf輸出的文本不會換行,如果需要換行,可以在對應的“格式替換符”后加入“\n”進行轉義
2. 使用printf輸出時,“指定的格式”與“被格式化的文本”之間,要用“,”隔開
3. 使用printf輸出時,“格式”中的“格式替換符”必須與“被格式化的文本”一一對應(個數要相同)
六. awk中的pattern模式
當awk進行逐行處理時,會把pattern作為條件,判斷當前行是否滿足條件,若跟pattern匹配,則進行后面的處理,否則,跳過當前行。

1. 正則表達式
awk下的正則表達式與grep下的區別:
1)awk下: awk '/正則表達式/{print}' /etc/passwd
2)grep下: grep "正則表達式" /etc/passwd

需要注意的是
1)在awk的正則表達式中,若出現"/",則需要進行轉義,在其前面加"\"
2)當使用{x,y}類型次數匹配的正則表達式時,需要使用--posix選項或--re-interval選項
2. 行范圍匹配
awk '/正則表達式1/,/正則表達式2/{action}' file
表示的是,從被正則表達式1匹配到的行開始,到被正則表達式2匹配到的行結束,之間所有的行都會執行對應的動作。
七. 關系運算符
| 關系運算符 | 含義 | 用法實例 |
| < | 小於 | x<y |
| <= | 小於等於 | x<=y |
| > | 大於 | x>y |
| >= | 大於等於 | x>=y |
| == | 等於 | x==y |
| != | 不等於 | x!=y |
| ~ | 匹配 | x~/正則表達式/ |
| !~ | 不匹配 | x!~/正則表達式/ |
八. 條件判斷
if(表達式)
{語句1}
else if(表達式)
{語句2}
else
{語句3}
實例
awk 'BEGIN{
test=100;
if(test>90){
print "very good";
}
else if(test>60){
print "good";
}
else{
print "no pass";
}
}'
九. 循環語句
1. while循環語句
while(表達式)
{語句}
實例
awk 'BEGIN{
test=100;
total=0;
while(i<=test){
total+=i;
i++;
}
print total;
}'
2. for循環語句
1)第一種
for(變量 in 數組)
{語句}
2)第二種
for(變量;條件;表達式)
{語句}
3. do循環語句
do
{語句}
while(條件)
