1、AWK內建變數
AWK內建變數如下表:
awk內建變數 | 作用 |
---|---|
$0 |
代表目前AWK所讀入的整行資料。我們已知AWK是一行一行讀入資料的,$0 就代表當前讀入行的整行資料。 |
$n |
代表目前讀入行的第n個欄位。 |
NF |
當前行擁有的欄位(列)總數。 |
NR |
當前AWK所處理的行,是總資料的第幾行。 |
FS |
使用者定義分隔符。AWK的預設分隔符是任何空格(tab鍵或者空格),如果想要使用其他分隔符(如“:”),就需要FS 變數定義。 |
ARGC |
命令列引數個數。 |
ARGV |
命令列引數陣列。 |
FNR |
當前檔案中的當前記錄數(對輸入檔案起始為1)。 |
OFMT |
數值的輸出格式(預設為%.6g )。 |
OFS |
輸出欄位的分隔符(預設為空格)。 |
ORS |
輸出記錄分隔符(預設為換行符)。 |
RS |
輸入記錄分隔符(預設為換行符)。 |
2、練習說明
(1)$n
變數練習
使用如下文字:
ID Name Python Linux MySQL Java
1 Tangs 88 87 86 85.55
2 Sunwk 99 98 97 96,66
3 Zhubj 77 76 75 74.44
4 Shahs 66 65 64 63.33
比如我們提取文字中的第2列資料,執行如下命令:
[root@localhost tmp]# awk '{printf $2 "\n"}' student.txt
Name
Tangs
Sunwk
Zhubj
Shahs
(2)FS
變數練習
AWK的預設分隔符是任何空格(tab
鍵或者空格),如果想要使用其他分隔符,就需要FS
變數定義。
cut
命令預設是以tab
鍵做為分隔符。
我們之前用cut
命令提取過/etc/passwd
檔案中普通使用者的使用者名稱,現在我們來用AWK來提取能正常登陸使用者的使用者名稱。
執行如下命令:
[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk '{FS=":"} {printf $1 "\n"}'
root:x:0:0:root:/root:/bin/bash
user1
user2
說明:
FS
變數指定分隔符是一個單獨的動作,而列印輸出是另外一個動作。
看到上面的結果我們會發現,user1
和user2
使用者的資訊正確提取了,而第一行root
使用者的資訊,是把整行的資料都列印輸出了,沒有按:
冒號做為分隔符來正確的提取。
是因為AWK先把一行資料讀取進AWK中,然後在用後面的動作,再對讀入的資料進行處理。
也就是說我已經把第一行的root
使用者的資訊,已經讀入到awk中,$0
、$1
、$2
等變數已經賦值好了,然後才在後邊的動作中看到你指定了:
冒號作為分隔符,這個時候第一行資料已經來不及處理了,只能用AWK預設的處理方式,用空格作為分隔符來處理,這一行沒有空格,就會把這一行的所有資料全部列印出來了。
到了處理第二行資料的時候,AWK已經知道要用:
冒號作為分隔符,這個時候就可以正確處理資料了。
現在就需要用的BEGIN
來處理這個問題,把分隔符的指定{FS=":"}
放入BEGIN
中就可以了。
[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\n"}'
root
user1
user2
這樣就可以正確提取到我們需要的資料了。
所以在使用AWK的時候,如果需要手動指定分隔符,要把這個指定分隔符的動作寫在BEGIN
中。
總結:如果有明顯的分隔符,推薦優先使用
cut
命令,因為簡單。
但是如果需要一些判斷的話,比如我需要根據使用者ID,檢視某一個使用者的使用者名稱。
這個時候用AWK就方便很多,cut
命令就不能直接處理了,需要寫指令碼程式進行過濾。
比如列印uid=500
的使用者的使用者名稱,命令如下:
[root@localhost tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} $3=="500" {printf $1 "\n"}'
user1
# $3=="500"也可以寫成$3==500或者$3=/500/都可以
(3)NF
變數和NR
變數練習
我們還是以/etc/passwd
檔案中的內容為例,需求列印輸出可登入的使用者的使用者名稱,使用者ID,行號,欄位數(也就是列數)。
執行如下命令:
# 提示:寫法是,輸出格式在雙引號裡,變數在雙引號外。
[root@192 tmp]# cat /etc/passwd | grep "/bin/bash" | awk 'BEGIN{FS=":"} {printf $1 "\t" $3 "\t 行號:" NR "\t 欄位數:" NF "\n"}'
root 0 行號:1 欄位數:7
user1 500 行號:2 欄位數:7
user2 501 行號:3 欄位數:7
注意一下,最終傳入AWK中處理的資料就三行,如下:
[root@192 tmp]# cat /etc/passwd | grep "/bin/bash"
root:x:0:0:root:/root:/bin/bash
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash
3、總結:
我們就學會前5個AWK內建變數就可以了,後邊的AWK內建變數一般用不到,換句話說就是能用Shell處理的,就少用AWK處理,以後如果真要用到AWK進行更深層次的程式設計,自己再單獨的學習一下AWK。