awk內(nèi)置變量
awk有許多內(nèi)置變量用來設(shè)置環(huán)境信息,這些變量可以被改變,下面給出了最常用的一些變量。
ARGC 命令行參數(shù)個數(shù)
ARGV 命令行參數(shù)排列
ENVIRON 支持隊列中系統(tǒng)環(huán)境變量的使用
FILENAME awk瀏覽的文件名
FNR 瀏覽文件的記錄數(shù)
FS 設(shè)置輸入域分隔符,等價于命令行 -F選項
NF 瀏覽記錄的域的個數(shù)
NR 已讀的記錄數(shù)
OFS 輸出域分隔符
ORS 輸出記錄分隔符
RS 控制記錄分隔符
此外,
$0變量是指整條記錄。$1表示當(dāng)前行的第一個域,$2表示當(dāng)前行的第二個域,......以此類推。
統(tǒng)計/etc/passwd:文件名,每行的行號,每行的列數(shù),對應(yīng)的完整行內(nèi)容:
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
filename:/etc/passwd,linenumber:2,columns:7,linecontent:daemon:x:1:1:daemon:/usr/sbin:/bin/sh
filename:/etc/passwd,linenumber:3,columns:7,linecontent:bin:x:2:2:bin:/bin:/bin/sh
filename:/etc/passwd,linenumber:4,columns:7,linecontent:sys:x:3:3:sys:/dev:/bin/sh
使用printf替代print,可以讓代碼更加簡潔,易讀
awk -F ':' '{printf("filename:%10s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
awk編程
變量和賦值
除了awk的內(nèi)置變量,awk還可以自定義變量。
下面統(tǒng)計/etc/passwd的賬戶人數(shù)
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
......
user count is 40
count是自定義變量。之前的action{}里都是只有一個print,其實print只是一個語句,而action{}可以有多個語句,以;號隔開。
這里沒有初始化count,雖然默認是0,但是妥當(dāng)?shù)淖龇ㄟ€是初始化為0:
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
[start]user count is 0
root:x:0:0:root:/root:/bin/bash
...
[end]user count is 40
統(tǒng)計某個文件夾下的文件占用的字節(jié)數(shù)
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
[end]size is 8657198
如果以M為單位顯示:
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
[end]size is 8.25889 M
注意,統(tǒng)計不包括文件夾的子目錄。
分組
awk 'BEGIN{FS=","} {if(NF == 12) print $0 >>$1".txt" }' 2017.csv