1. 程式人生 > >awk命令基本使用(1)

awk命令基本使用(1)

1、通過man awk可知它的詳情

awk 是一種程式語言,awk有很多內建的功能,比如陣列、函式等.....

例項1通過awk得到IP

[[email protected] ~]# ifconfig
em1       Link encap:Ethernet  HWaddr 14:18:77:70:62:20  
          inet addr:10.12.50.78  Bcast:10.12.50.255  Mask:255.255.255.0
          inet6 addr: fe80::1618:77ff:fe70:6220/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5893345 errors:0 dropped:0 overruns:0 frame:0
          TX packets:165708 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:886835464 (845.7 MiB)  TX bytes:160953846 (153.4 MiB)
          Interrupt:41 

[[email protected] ~]# ifconfig em1|awk -F '[ :]+' 'NR==2 {print $4}'
10.12.50.78

[[email protected] ~]#

awk相關解釋: -F 是指定分隔符;'[ :]+ ' 代表正則;中括號內的是要匹配的內容;‘+’代表匹配連續多個。例子中代表匹配多個空格及“:"作為分隔符;NR 是awk的內建變數代表行 $4 代表第4列;print 是輸出;
              inet    addr:10.12.50.78  


第1列   第2列  第3列   第4列

(1、2,3列是以空格為分隔符) (3,4是以“ : ” 分隔符)

注意:awk 後跟的語句必須用單引號包含

[[email protected] ~]# ifconfig em2|awk -F "[ :]+" 'NR==2 {print $4}'  
10.11.45.90
[[email protected] ~]# ifconfig em2|awk -F "[ :]+"
"NR==2 {print $4}"
         

  inet addr:10.12.50.78  Bcast:10.12.50.255  Mask:255.255.255.0

例項2通過awk得到行號,得到列
[[email protected] ~]# awk  '{print NR,$0}' /etc/passwd  
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[[email protected] ~]#

例項相關解釋:NR(每行的記錄號,多檔案記錄遞增)代表行;$0代表整行內容;$1代表第一列$2第二列$3.....$NF最後一列,$(NF-1)

[[email protected] ~]# awk  -F ":" '{print $(NF-1)":"$NF}' /etc/passwd 
/root:/bin/bash
/bin:/sbin/nologin
/sbin:/sbin/nologin
/var/adm:/sbin/nologin
/var/spool/lpd:/sbin/nologin
/sbin:/bin/sync
/sbin:/sbin/shutdown

例項3通過awk 取出5到8行的內容

[[email protected] ~]# awk  '{if(NR<9 && NR>4) print NR,$0}' /etc/passwd  
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
[[email protected] ~]# 

例項4通過awk過濾空格或#

原資料

[[email protected] ~]# cat awke 
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>

SSLRandomSeed startup builtin

SSLRandomSeed connect builtin

</IfModule>
[[email protected] ~]# 

處理後的資料
[[email protected] ~]# awk '/^[^ ]/' awke 
#Include conf/extra/httpd-ssl.conf
#
# Note: The following must must be present to support
#       starting without SSL on platforms with no /dev/random equivalent
#       but a statically compiled-in mod_ssl.
#
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
[[email protected] ~]# awk '/^[^ #]/' awke
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

例項相關解釋 '/^[^ #]/';
                       紅的^排除[]裡的內容;中括號內的橙黃色^是以空格開頭

例項5awk計算記憶體佔用率

[[email protected] ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         31994       3593      28401          0        175       1175
-/+ buffers/cache:       2242      29751
Swap:        16063          0      16063
[[email protected] ~]# MEMUsed=$(free -m|egrep "Mem"|awk '{print $3}')                     
[[email protected] ~]# MEMTotal=$(free -m|egrep "Mem"|awk '{print $2}')                    
[[email protected] ~]# MEMUsage=$(awk 'BEGIN{printf"%.0f\n",('$MEMUsed'/'$MEMTotal')*100}')
[[email protected] ~]# echo  $MEMUsage
11
[[email protected] ~]# 

[[email protected] ~]# MEMUsage=$(awk 'BEGIN{printf"%.2f\n",('$MEMUsed'/'$MEMTotal')}')    
[[email protected] ~]# echo  $MEMUsage
0.11

例項5相關解釋:awk 指定輸出格式

awk 'BEGIN{printf"%.2f\n",('$MEMUsed'/'$MEMTotal')*100}'

printf

%f                                     浮點型 #使用小數點後2位%.2f (用於除法後)

BEGIN與END的作用是給程式賦予初始狀態和程式結束後執行掃尾的工作;任何在BEGI 之後列出的操作({}內)awk開始掃描輸入之前執行,END掃描全部的輸入之前執行結束之後執行。通常使用BEIN來顯示變數和初始化變數,使用END來輸出最後的結果。

[[email protected]  ]# awk 'BEGIN{array[1]="abc";array[2]="efg";for(key in array) print key,array[key]}'   不需要跟檔案
1 abc
2 efg
[[email protected] ]# 

[[email protected] ~]# echo qw> /home/a.log 
[[email protected] ~]# awk '{array[1]="abc";array[2]="efg";}END{for(key in array) print key,array[key]}' /home/a.log ##後跟任意檔案才能輸出結果
1 abc
2 efg