AWK中,變數分為兩種:內置變數與自定義變數。 常見的內置變數有: FS:輸入欄位分隔符, 預設為空白字元 OFS:輸出欄位分隔符, 預設為空白字元 RS:輸入記錄分隔符(輸入換行符), 指定輸入時的換行符 ORS:輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符 NF:number of ...
AWK中,變數分為兩種:內置變數與自定義變數。
常見的內置變數有:
FS:輸入欄位分隔符, 預設為空白字元
OFS:輸出欄位分隔符, 預設為空白字元
RS:輸入記錄分隔符(輸入換行符), 指定輸入時的換行符
ORS:輸出記錄分隔符(輸出換行符),輸出時用指定符號代替換行符
NF:number of Field,當前行的欄位的個數(即當前行被分割成了幾列),欄位數量
NR:行號,當前處理的文本行的行號。
FNR:各文件分別計數的行號
FILENAME:當前文件名
ARGC:命令行參數的個數
ARGV:數組,保存的是命令行所給定的各參數
下麵的NF 列印出每行有多少列:
ghostwu@dev:~/linux/awk$ awk '{print NF}' ghostwu.txt 1 2 3 ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu zhangsan 22 lisi 23 woman
引用NF變數,需要用美元符號
ghostwu@dev:~/linux/awk$ cat ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman ghostwu@dev:~/linux/awk$ awk '{print $NF}' ghostwu.txt man woman woman ghostwu@dev:~/linux/awk$ awk '{print $(NF-2), $(NF-1), $(NF)}' ghostwu.txt ghostwu 20 man zhangsan 22 woman lisi 23 woman
NR:每一行的行號:
ghostwu@dev:~/linux/awk$ awk '{print NR,$0}' ghostwu.txt 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman
1,awk支持多文件掃描,如果採用NR, 下一個文件的行序號會接著上一個文件,FNR就會單獨統計
ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt ghostwu.bak 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman 4 ghostwu 20 man 5 zhangsan 22 woman 6 lisi 23 woman ghostwu@dev:~/linux/awk$ awk '{print FNR, $0}' ghostwu.txt ghostwu.bak 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman
2,RS指定行輸入符,預設為回車換行,如果我們想讓他以空格作為行輸入符( 即,遇到空格就換行 ),當我們指定使用空格作為"行分隔符"時,在awk解析文本時,每當遇到空格,awk就認為遇到的空格是換行符,於是awk就將文本換行了
ghostwu@dev:~/linux/awk$ awk '{print NR, $0}' ghostwu.txt 1 ghostwu 20 man 2 zhangsan 22 woman 3 lisi 23 woman ghostwu@dev:~/linux/awk$ awk -v RS=" " '{print NR, $0}' ghostwu.txt 1 ghostwu 2 20 3 man zhangsan 4 22 5 woman lisi 6 23 7 woman
3,ORS指定輸出行分隔符
ghostwu@dev:~/linux/awk$ awk -v ORS='---->' '{print $0}' ghostwu.txt ghostwu 20 man---->zhangsan 22 woman---->lisi 23 woman---->ghostwu@dev:~/linux/awk$
4,可以同時指定,輸入,輸出行分隔符
ghostwu@dev:~/linux/awk$ awk -v RS=" " -v ORS='->' '{print $0}' ghostwu.txt ghostwu->20->man zhangsan->22->woman lisi->23->woman
5,FILENAME:文件名稱
ghostwu@dev:~/linux/awk$ awk '{print FILENAME, NR, $0}' ghostwu.txt ghostwu.bak ghostwu.txt 1 ghostwu 20 man ghostwu.txt 2 zhangsan 22 woman ghostwu.txt 3 lisi 23 woman ghostwu.bak 4 ghostwu 20 man ghostwu.bak 5 zhangsan 22 woman ghostwu.bak 6 lisi 23 woman
6,ARGV保存命令行參數的數組,'pattern{action}'並不被看做參數
ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2]}' ghostwu.txt awk ghostwu.txt awk ghostwu.txt awk ghostwu.txt
7,ARGC:命令行參數的個數,下例:ARGV[1]沒有值,因為命令行沒有給第三個參數
ghostwu@dev:~/linux/awk$ awk '{print ARGV[0], ARGV[1], ARGV[2], ARGC}' ghostwu.txt awk ghostwu.txt 2 awk ghostwu.txt 2 awk ghostwu.txt 2
自定義變數:用戶自己定義的變數,有兩種形式
1,-v varname=value 變數名區分字元大小寫
ghostwu@dev:~/linux/awk$ awk -v my_name="ghostwu" 'BEGIN{print my_name}' ghostwu
2,在program中直接定義,以下定義了3個自定義變數,其實形式像編程語言一樣,定義的時候用分號。列印變數跟之前一樣,用逗號隔開,註意,不需要用美元符號.
ghostwu@dev:~/linux/awk$ awk 'BEGIN{ my_name="ghost"; my_age=22; my_sex="男"; print my_name, my_age, my_sex}' ghost 22 男
3,也可以引用命令行定義的變數
ghostwu@dev:~/linux/awk$ echo $myvar ghostwu@dev:~/linux/awk$ myvar="我在命令行定義的變數" ghostwu@dev:~/linux/awk$ awk -v var1=$myvar 'BEGIN{print var1}' 我在命令行定義的變數