Linux命令之awk:變量應用(二)

awk內置變量(預約義變量)

說明:[A][N][P][G]表示第一個支持變量的工具,[A]=awk、[N]=nawk、[P]=POSIXawk、[G]=gawkmysql

  • $n 當前記錄的第n個字段,好比n爲1表示第一個字段,n爲2表示第二個字段。
  • $0 這個變量包含執行過程當中當前行的文本內容。
  • [A] FS :字段分隔符(默認是任何空格)。
  • [A] NF :表示字段數,在執行過程當中對應於當前的字段數。
  • [A] NR :表示記錄數,在執行過程當中對應於當前的行號。
  • [A] FILENAME : 當前輸入文件的名。
  • [A] OFMT :數字的輸出格式(默認值是%.6g)。
  • [A] OFS :輸出字段分隔符(默認值是一個空格)。
  • [A] ORS :輸出記錄分隔符(默認值是一個換行符)。
  • [A] RS :記錄分隔符(默認是一個換行符)。
  • [N] ARGC :命令行參數的數目。
  • [N] ARGV :包含命令行參數的數組。
  • [N] ERRNO :最後一個系統錯誤的描述。
  • [N] RSTART :由match函數所匹配的字符串的第一個位置。
  • [N] RLENGTH :由match函數所匹配的字符串的長度。
  • [N] SUBSEP 數組下標分隔符(默認值是34)。
  • [P] ENVIRON :環境變量關聯數組。
  • [P] FNR :同NR,但相對於當前文件。
  • [G] ARGIND :命令行中當前文件的位置(從0開始算)。
  • [G] CONVFMT :數字轉換格式(默認值爲%.6g)。
  • [G] FIELDWIDTHS :字段寬度列表(用空格鍵分隔)。
  • [G] IGNORECASE :若是爲真,則進行忽略大小寫的匹配。

示例sql

NR紀錄數

NF字段數

FILENAME文件名

ARGC命令行參數數量

[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

NR變量的應用(紀錄數)

統計文件中的行數: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變量的應用

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變量的應用

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

RS變量控制記錄分隔符

[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

NF變量的應用(打印某個字段)

[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外部變量

通常變量

在awk中,設置有意義的域名是一種好習慣通常的變量名設置方式爲 var = $n,這裏var    爲調用的域變量名, n爲實際域號。函數

  • 找出uid>1000的用戶
[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

將外部變量值傳遞給awk

  • 藉助-v選項,能夠將外部值(並不是來自stdin)傳遞給awk:
  • 另外一種傳遞外部變量方法
  • 當輸入來自於文件時使用
[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語句塊以後。

相關文章
相關標籤/搜索