Linux常用基本命令:三劍客命令之-awk內置變量與自定義變量


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}'
我在命令行定義的變量

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM