一、變量概述
對於awk來說"變量"又分為"內置變量" 和 "自定義變量" , "輸入分隔符FS"和"輸出分隔符OFS"都屬於內置變量。內置變量就是awk預定義好的、內置在awk內部的變量,而自定義變量就是用戶定義的變量。
awk常用的內置變量以及其作用如下:
FS:輸入字段分隔符, 默認為空格
OFS:輸出字段分隔符, 默認為空格
RS:輸入記錄分隔符(輸入換行符), 指定輸入時的換行符,默認為換行符\n
ORS:輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符,默認為換行符\n
NF:number of Field,當前行的字段的個數(即當前行被分割成了幾列),字段數量
NR:行號,當前處理的文本行的行號。
FNR:各文件分別計數的行號
FILENAME:當前文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
二、內置變量
2.1內置變量NR
內置變量NR表示每一行的行號,內置變量NF表示每一行中一共有幾列,那么,也就是說,我們可以通過下例中的方法,得到t1.txt文本中,每一行的行號以及每一行對應的列的數量。


【注意】細心如你一定注意到了一個細節,就是在打印 $0 , $1 , $2 這些內置變量的時候,都有使用到"$"符號,但是在調用 NR , NF 這些內置變量的時候,就沒有使用"$",如果你有點不習慣,那么可能是因為你已經習慣了使用bash的語法去使用變量,在bash中,我們在引用變量時,都會使用$符進行引用,但是在awk中,只有在引用$0、$1等內置變量的值的時候才會用到"$",引用其他變量時,不管是內置變量,還是自定義變量,都不使用"$",而是直接使用變量名。
2.2內置變量FNR
當我們使用awk同時處理多個文件,並且使用NR顯示行號的時候,效果如下圖。

如果使用NR參數,會將兩個文本文件看成一個文件來顯示(計數)行號;如果使用FNR參數,就會將兩個文本文件分別顯示(計數)行號。效果如下:

2.3內置變量RS
RS是輸入行分隔符,如果不指定,默認的"行分隔符"就是我們所理解的"回車換行"。
假設,我們不想以默認的"回車換行"作為"行分隔符",而是想使用空格作為所謂的行分隔符,也就是說,我們想讓awk認為,每遇到一個空格,就換行,換句話說,我們想讓awk以為每次遇到一個空格就是新的一行(其它案例:讓awk以為每次遇到一個#就是新的一行)。那么我們該怎么做呢?示例如下:

awk思維:只要遇到空格就是新的一行,否則屬於同一行。
所以圖中第5行才會出現這種情況。awk認為Jack就是第5行。
2.4內置變量ORS
現在,我們改變一下awk的想法,我們讓awk認為,"**"才是真正的輸出行分隔符,示例如下圖:

在沒有指定輸出行分隔符之前,awk跟人類的邏輯思維是一樣一樣的,當人類想要換行的時候,就會"另起一行"(回車換行),awk也是一樣的,當它在輸出文字的時候,如果想要換行,就會"另起一行"(回車換行), 可是,如果我們指定了"輸出行分隔符"為"**",那么,當awk在輸出文字的時候,如果想要換行,就會"另起一行"(**),所以,對於awk來說,它完成了"另起一行"的動作,只不過,它所認為的"另起一行"的動作就是輸出"**",而不再是原來的輸出" 回車換行",所以,從人類看到的"表象上",awk並沒有換行,那是因為我們還是以"回車換行"作為換行的標准,而awk已經變了,它認為,"**"就是換行的標准。
把"輸入換行符"和"輸出換行符"同時使用,看看是什么效果,示例如下:

2.5內置變量FILENAME
FILENAME這個內置變量,從字面上,就能看出是什么意思,沒錯,就是顯示文件名,演示效果如下:

2.6內置變量ARGV和ARGC
ARGV內置變量表示的是一個數組,這個數組中保存的是命令行所給定的參數。這樣解釋還是很模糊,不容易理解,我們來看看示例:

先使用BEGIN模式,輸出一個字符串"aaa",然后,傳入兩個文件的文件名作為參數,我們發現,BEGIN模式正常執行了打印操作,輸出了"aaa"字符串 ,我們使用同樣的命令,同樣使用BEGIN模式,只不過,這次不只打印"aaa",還打印ARGV這個數組中的第二個元素的值。
ARGV內置變量表示的是一個數組,既然是數組,就需要用上圖中的下標的方式,引用對應元素的值,因為數組的索引都是從0開始的,所以,ARGV[1]表示引用ARGV數組中的第二個元素的值,從返回結果可以看出,ARGV[1]對應的值為t1.txt,同理,我們又使用第三條命令,多打印了一個ARGV[2]的值,發現ARGV[2]對應的值為t2.txt,這個時候,你明白ARGV內置變量的含義了嗎,說白了,ARGV內置變量表示的是:所有參數組成的數組。那么細心的你一定會問了,ARGV[0]對應的是哪個參數呢,我們來打印一下:

awk就是這么規定的,'pattern{ action }'並不被看做是參數,awk被看做為參數。
在剛才的例子中,應該有三個參數,awk、t1.txt、t2.txt,這三個參數作為數組的元素存放於ARGV中,現在,而ARGC則表示參數的數量,也可以理解為ARGV數組的長度。示例如下:

三、自定義變量
方法一:-v varname=value 變量名區分字符大小寫。
方法二:在program中直接定義。
3.1通過方法一自定義變量

3.2通過方式二自定義變量
直接在program中定義即可,但是注意,變量定義與動作之間需要用分號";"隔開。


當我們需要在awk中引用shell中的變量的時候,則可以通過方法一間接的引用。舉例如下:

【參考文章:http://www.zsythink.net/archives/1374】
