說明:[A][N][P][G]表示第一個支持變量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawkmysql
示例sql
[root@sxooky ~]# echo -e "line1 f2 f3\nline2 f4 f5\nline3 f6 f7" > a.txt [root@sxooky ~]# echo -e "test1 f2 f3 a1\ntest2 f4 f5 a2\ntest3 f6 f7 a3 a4" > b.txt [root@sxooky ~]# awk '{print "NR:"NR,"NF:"NF,"FILENAME:"FILENAME,"ARGC:"ARGC}' a.txt b.txt NR:1 NF:3 FILENAME:a.txt ARGC:3 NR:2 NF:3 FILENAME:a.txt ARGC:3 NR:3 NF:3 FILENAME:a.txt ARGC:3 NR:4 NF:4 FILENAME:b.txt ARGC:3 NR:5 NF:4 FILENAME:b.txt ARGC:3 NR:6 NF:5 FILENAME:b.txt ARGC:3
統計文件中的行數:apache
[root@sxooky ~]# cat a.txt line1 f2 f3 line2 f4 f5 line3 f6 f7 [root@sxooky ~]# awk 'END{print "NR_total:"NR}' a.txt NR_total:3
以上命令只使用了END語句塊,在讀入每一行的時,awk會將NR更新爲對應的行號,當到達最後一行NR的值就是最後一行的行號,因此END語句塊中的NR就是文件的行數。vim
每行中第一個字段的累加:數組
[root@sxooky ~]# seq 5 | awk 'BEGIN{ sum=0; print "求各字段累加總和:" } { print $1"+"; sum+=$1 } END{ print "等於"; print sum }' 求各字段累加總和: 1+ 2+ 3+ 4+ 5+ 等於 15
ORS輸出記錄分隔符,缺省則爲換行(「\n」) 如上例bash
上例中將其內容鏈接到一行:ssh
[root@sxooky ~]# seq 5 | awk 'BEGIN{ sum=0; print "求各字段累加總和:";ORS="" }NR==1{print $1;sum+=$1}NR>=2{print "+"$1;sum+=$1}END{ print "="; print sum "\n"}' 求各字段累加總和: 1+2+3+4+5=15
OFS輸出字段分隔符,默認爲空(沒有)。wordpress
[root@sxooky ~]# cat a.txt line1 f2 f3 line2 f4 f5 line3 f6 f7 [root@sxooky ~]# awk 'BEGIN{OFS=" - "}{print $1,$2,$3}' a.txt line1 - f2 - f3 line2 - f4 - f5 line3 - f6 - f7 [root@sxooky ~]# awk 'BEGIN{OFS="......"}{print $1,$2,$3}' a.txt line1......f2......f3 line2......f4......f5 line3......f6......f7
[root@sxooky ~]# awk 'BEGIN{ORS=" - "}{print}END{ORS="\n";print "\n"}' a.txt line1 f2 f3 - line2 f4 f5 - line3 f6 f7 - [root@sxooky ~]# awk 'BEGIN{ORS=" - "}{print}END{ORS="\n";print "\n"}' a.txt |awk 'BEGIN{RS=" - "}{print $1}' line1 line2 line3 [root@sxooky ~]# tail -1 /etc/passwd sxooky:x:3367:3367::/home/sxooky:/bin/bash [root@sxooky ~]# tail -1 /etc/passwd |awk 'BEGIN{RS=":"}{print $1}' sxooky x 3367 3367 /home/sxooky /bin/bash [root@sxooky ~]# tail -1 /etc/passwd |awk 'BEGIN{RS="/"}{print $1}' sxooky:x:3367:3367:: home sxooky: bin bash
[root@sxooky ~]# cd /usr/local/apache2.4/htdocs/wordpress/ [root@sxooky wordpress]# pwd /usr/local/apache2.4/htdocs/wordpress [root@sxooky wordpress]# pwd |awk -F"/" '{print $0}' /usr/local/apache2.4/htdocs/wordpress #打印最後一個字段或倒數第二個字段 [root@sxooky wordpress]# pwd |awk -F"/" '{print $NF}' wordpress [root@sxooky wordpress]# pwd |awk -F"/" '{print $(NF-1)}' htdocs
在awk中,設置有意義的域名是一種好習慣通常的變量名設置方式爲 var = $n,這裏var 爲調用的域變量名, n爲實際域號。函數
[root@sxooky ~]# tail -1 /etc/passwd sxooky:x:3367:3367::/home/sxooky:/bin/bash [root@sxooky ~]# awk -F: '{name=$1;id=$3;if(id>1000)print name "\t" id}' /etc/passwd mysql 3366 sxooky 3367
統計當前文件下面全部文件的大小之和:工具
[root@sxooky ~]# ls -al |awk 'BEGIN{total=0}{if(/^[^d]/){total+=$5;print $5"\t"$9}}END{print "total size:" total}' 36 a.txt 18 awk_var.txt 14522 .bash_history 18 .bash_logout 176 .bash_profile 176 .bashrc 48 b.txt 100 .cshrc 74454 logssh.txt 893 .mysql_history 64 .pydistutils.cfg 129 .tcshrc 8979 .viminfo total size:99613
[root@sxooky ~]# VAR=12345 [root@sxooky ~]# echo |awk -v var=$VAR '{print var}' 12345 [root@sxooky ~]# var1="abc" [root@sxooky ~]# var2="123" [root@sxooky ~]# echo |awk '{print v1 "\t" v2}' v1=$var1 v2=$var2 abc 123 [root@sxooky ~]# vim awk_var.txt
以上方法中,變量之間用空格分隔做爲awk的命令行參數跟隨在BEGIN、{}和END語句塊以後。