Linux文本處理三劍客之awk詳解

一、awk工具介紹
awk是一個強大的文本分析工具,跟sed一樣,是面向行的處理工具,不過awk也可以對每行進行切片處理,也就是所謂的列,在對數據進行分析時功能尤爲強大。

二、awk的基本使用
格式:awk [選項] ‘[條件]{指令}’ filename
其中,print是awk工具最常用的編輯命令,可以使用分號分隔。
awk過濾數據時支持僅打印文件的某一列,如第2列、第3列等。
處理文件時,若沒有指定分隔符,則默認將空格、製表符等作爲分隔符。
awk同樣也支持正則
過濾文件內容:
源文件內容:

[root@redhat ~]#cat a.txt
wo shi redhat7
ni shi centos6

打印文件按的第1列和第3列:

[root@redhat ~]#awk '{print $1,$3}' a.txt
wo redhat7
ni centos6

結合管道過濾命令輸出:
查看磁盤剩餘空間:

[root@redhat ~]# df -h
文件系統               容量  已用  可用 已用% 掛載點
/dev/mapper/rhel-root   17G  1.5G   16G    9% /
devtmpfs               901M     0  901M    0% /dev
tmpfs                  912M     0  912M    0% /dev/shm
tmpfs                  912M  8.4M  904M    1% /run
tmpfs                  912M     0  912M    0% /sys/fs/cgroup
/dev/sda1             1014M  143M  872M   15% /boot
tmpfs                  183M     0  183M    0% /run/user/0

打印磁盤剩餘的總空間:

[root@redhat ~]#df -h | sed -n '2p' | awk '{print $4}'
16G 
或使用正則匹配:
[root@redhat ~]# df -h | head -2 | tail -1 | awk '/\/$/{print $4}'
16G
玩法很多,可以用自己學過的知識多練習

使用-F可以指定分隔符:
輸出/etc/passwd文件中以冒號分隔的第1、第7個字段,操作如下:
#print打印不同字段之間以逗號隔開,如果不使用逗號隔開打印出來的字段之間是連接在一起的,沒有空格

[root@redhat ~]# awk -F: '{print $1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
games /sbin/nologin
ftp /sbin/nologin
nobody /sbin/nologin
systemd-network /sbin/nologin
dbus /sbin/nologin
polkitd /sbin/nologin
postfix /sbin/nologin
chrony /sbin/nologin
sshd /sbin/nologin

awk還可以識別多種單個字符,比如以":“或”/“分隔,輸出第1和第10個字段:
注意:如果以”:“或”/“分隔作爲分隔符,則文件中每一行遇到連續的”:“和”/",則它們之間的內容爲空,所以在輸出的時候可能會有輸出的列爲空的情況,看下面,拿出/etc/passwd中sshd開頭的這一行舉個列子:

sshd : x : 74 : 74 : Privilege-separated SSH:  / var / empty / sshd :   / sbin / nologin
1       2   3     4             5             6   7        8     9    10   11       12   
#可以看到第10列正好爲空
[root@redhat ~]# awk -F[:/] '{print $1,$10}' /etc/passwd 
root bash
bin nologin
daemon nologin
adm sbin
lp 
sync sync
shutdown shutdown
halt halt
mail 
operator nologin
games sbin
ftp sbin
nobody nologin
systemd-network nologin
dbus nologin
polkitd nologin
postfix 
chrony 
sshd 

awk常用的內置變量

變量 作用
$0 輸出文本當前行的全部內容
$1 輸出文本的第一列
$2 輸出文本的第二列
$3 輸出文本的第三列,以此類推
NR 輸出文件當前行的所有行號
NF 輸出文件當前行的列數(有幾列)

awk應用實例:
1.輸出每次處理行的行號,以及當前行以":"爲分隔符的字段個數(有幾列):

[root@redhat ~]# awk -F: '{print NR,NF}' /etc/passwd
1 7
2 7
3 7
4 7
5 7
... ...

2.awk的print指令不僅可以打印變量,也可以打印常量:

[root@redhat ~]# awk -F: '{print $1"的解釋:"$7}' /etc/passwd 
root的解釋:/bin/bash
bin的解釋:/sbin/nologin
daemon的解釋:/sbin/nologin
adm的解釋:/sbin/nologin
lp的解釋:/sbin/nologin
sync的解釋:/bin/sync
shutdown的解釋:/sbin/shutdown
halt的解釋:/sbin/halt
mail的解釋:/sbin/nologin
operator的解釋:/sbin/nologin
games的解釋:/sbin/nologin
ftp的解釋:/sbin/nologin
nobody的解釋:/sbin/nologin
systemd-network的解釋:/sbin/nologin
dbus的解釋:/sbin/nologin
polkitd的解釋:/sbin/nologin
postfix的解釋:/sbin/nologin
chrony的解釋:/sbin/nologin
sshd的解釋:/sbin/nologin

查看本機有哪些網卡,現在使用的是哪個網卡:

[root@redhat ~]# ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.12  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:fe23:9382  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:23:93:82  txqueuelen 1000  (Ethernet)
        RX packets 101062  bytes 10218104 (9.7 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1525  bytes 182521 (178.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

3.提取本機的IP地址:

[root@redhat ~]# ifconfig ens33 | sed -n '2p' | awk '{print $2}'
192.168.0.12

4.過濾出接收數據的流量:
RX爲接收數據的流量,TX爲發送數據的流量。packets以數據包的數量爲單位,bytes以字節爲單位。

[root@redhat ~]# ifconfig ens33 | awk '/RX p/{print $5}' 
11108404

5.過濾出發送數據的流量:

[root@redhat ~]# ifconfig ens33 | awk '/TX p/{print $5}' 
221119

三、awk處理的時機
awk會逐行處理文本,支持在處理第一行之前做一些準備工作,以及在處理完最後一行之後做一些總結性質的工作。在命令格式上分別體現如下:
awk [選項] ‘[條件]{指令}’ filename
awk [選項] ’ BEGIN{指令} {指令} END{指令}’ filename
BEGIN{ } 行前處理,讀取文件內容前執行,指令執行1次
{ } 逐行處理,讀取文件過程中執行,指令執行n次
END{ } 行後處理,讀取文件結束後執行,指令執行1次
只做預處理的時候,可以沒有操作文件,比如:

[root@redhat ~]# awk 'BEGIN{A=12;print A*3}'
36
[root@redhat ~]# awk 'BEGIN{print B+3}' //B可以不定義,直接用,默認值爲0
3
[root@redhat ~]# awk 'BEGIN{print 2.5+3.8}'
6.3

舉個例子(統計系統中使用bash作爲登錄Shell的用戶總個數):
a.預處理時賦值變量x=0
b.然後逐行讀入/etc/passwd文件,如果發現登錄Shell是/bin/bash則x加1
c.全部處理完畢後,輸出x的值即可。相關操作及結果如下:

[root@redhat ~]# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd 
2

格式化輸出/etc/passwd文件(awk同樣支持製表符\t和換行符\n):
要求: 格式化輸出passwd文件內容時,要求第一行爲列表標題,中間打印用戶的名稱、UID、家目錄信息,最後一行提示一共已處理文本的總行數:

[root@redhat ~]# awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6} END{print "Total",NR,"line."}' /etc/passwd
User    UID     Home
root    0       /root
bin     1       /bin
daemon  2       /sbin
adm     3       /var/adm
lp      4       /var/spool/lpd
sync    5       /sbin
shutdown        6       /sbin
halt    7       /sbin
mail    8       /var/spool/mail
operator        11      /root
games   12      /usr/games
ftp     14      /var/ftp
nobody  99      /
systemd-network 192     /
dbus    81      /
polkitd 999     /
postfix 89      /var/spool/postfix
chrony  998     /var/lib/chrony
sshd    74      /var/empty/sshd
wuyoupin        1000    /home/wuyoupin
Total 20 line.

四、awk處理條件
使用正則設置條件:
1.輸出/etc/passwd文件中以bash結尾的完整記錄:

[root@redhat ~]# awk -F: '/bash$/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

2.輸出/etc/passwd文件中包含root的行數據:

[root@redhat ~]# awk -F: '/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.輸出/etc/passwd文件中root或adm賬戶的用戶名和UID信息:

[root@redhat ~]# awk -F: '/^(root|adm)/{print $1,$3}' /etc/passwd
root 0
adm 3

4.輸出/etc/passwd文件中賬戶名稱包含root的基本信息(第1列包含root):

[root@redhat ~]# awk -F: '$1~/root/' /etc/passwd
root:x:0:0:root:/root:/bin/bash

5.輸出/etc/passwd文件中登陸shell不以nologin結尾的用戶名、登陸shell信息:
#可以對第7個字段做反向匹配

[root@redhat ~]# awk -F: '$7!~/nologin$/{print $1,$7}' /etc/passwd
root /bin/bash
sync /bin/sync
shutdown /sbin/shutdown
halt /sbin/halt

使用數值/字符串比較設置條件:

比較符號 作用
== 等於
!= 不等於
> 大於
>= 大於等於
< 小於
<= 小於等於

1.輸出/etc/passwd文件的第3行的用戶記錄:

[root@redhat ~]# awk -F: 'NR==3{print}' /etc/passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin

2.輸出/etc/passwd文件中賬戶UID大於等於900的賬戶名稱和UID:

[root@redhat ~]# awk -F: '$3>=900{print $1,$3}' /etc/passwd  
polkitd 999
chrony 998

3.輸出/etc/passwd文件中賬戶UID小於10的賬戶名稱和UID信息:

[root@redhat ~]# awk -F: '$3<10{print $1,$3}' /etc/passwd    
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8

4.輸出/etc/passwd文件中用戶名爲root的行:

[root@redhat ~]# awk -F: '$1=="root"{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

邏輯測試條件:
1.輸出/etc/passwd文件中用戶賬戶UID大於10並且小於20的賬戶信息:

[root@redhat ~]# awk -F: '$3>10 && $3<20' /etc/passwd
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.輸出/etc/passwd文件中賬戶UID大於900或者賬戶UID小於10的賬戶信息:

[root@redhat ~]# awk -F: '$3>900 || $3<10' /etc/passwd  
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin

數學運算

[root@redhat ~]# awk 'BEGIN{x++;print x}'
1
[root@redhat ~]# awk 'BEGIN{x=8;print x+=2}'
10
[root@redhat ~]# awk 'BEGIN{x=8;x--;print x}'
7
[root@redhat ~]# awk 'BEGIN{print 2+3}'
5
[root@redhat ~]# awk 'BEGIN{print 2*3}'
6
[root@redhat ~]# awk 'BEGIN{ print 23%8}' //求23除以8的餘數
7
[root@redhat ~]# seq  20 | awk  '$1%3==0' //求20以內30的倍數
3
6
9
12
15
18

練習:
1.列出/etc/passwd文件中UID間於1~900的用戶詳細信息:

[root@redhat ~]# awk -F: '$3>=1 && $3<=900' /etc/passwd  
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

2.輸出/etc/hosts映射文件內以127或者:開頭的記錄:

[root@redhat ~]# awk  '/^(127|:)/' /etc/hosts   
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

3.列出30以內整數中7的倍數或者含7的數:

[root@redhat ~]# seq 30 | awk '$1%7==0||$1~/7/'   
7
14
17
21
27
28

寫一個簡單的腳本練習一下
編寫腳本的任務要求如下:
分析出使用bash作登錄Shell的本地用戶
列出這些用戶的shadow密碼記錄
按每行“用戶名 – 密碼記錄”保存結果

[root@redhat ~]#vim get_user_password.sh
#!/bin/bash
user=$(awk -F: '/bash$/{parint $1}' /etc/passwd)
for i in ${user}
do
	grep ${i} /etc/shadow | awk -F: '{print $1,"-->",$2}'
done

五、awk流程控制
1.awk過濾中if分支結構
a.單分支
統計/etc/passwd文件中UID小於或等於10的用戶個數:

[root@redhat ~]# awk -F: '{if($3<=10){i++}}END{print i}' /etc/passwd
9

統計/etc/passwd文件中UID大於850的用戶個數:

[root@redhat ~]# awk -F: '{if($3>=850){i++}}END{print i}' /etc/passwd
3

統計/etc/passwd文件中登錄Shell是“/bin/bash”的用戶個數:

[root@redhat ~]# awk -F: '{if($7=="/bin/bash"){i++}}END{print i}' /etc/passwd
2
或者
[root@redhat ~]# awk -F: '{if($7~/bash$/){i++}}END{print i}' /etc/passwd
2

b.雙分支
分別統計/etc/passwd文件中UID小於或等於500、UID大於500的用戶個數:

[root@redhat ~]# awk -F: '{if($3<500){i++}else{j++}}END{print "UID小於500的賬戶的個數:"i"\n""UID大於500的賬戶的個數:"j}' /etc/passwd
UID小於500的賬戶的個數:17
UID大於500的賬戶的個數:3
#爲了顯示效果好看一點,我這裏給輸出加上了換行符,換行輸出

六、awk數組
1.數組的語法格式:
數組是一個可以存儲多個值的變量,具體使用的格式如下:
定義數組的格式:數組名[下標]=元素值
調用數組的格式:數組名[下標]
遍歷數組的用法:for(變量 in 數組名){print 數組名[變量]}。

[root@redhat ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'
88 11
#參考解釋:定義數組a[0]=11,a[1]=88,輸出a[0]與a[1]的值

[root@redhat ~]# awk 'BEGIN{a++;print a}'
1
[root@redhat ~]# awk 'BEGIN{a0++;print a0}'
1
[root@redhat ~]# awk 'BEGIN{a[0]++;print a[0]}'
1
[root@redhat ~]# awk 'BEGIN{a[0]=0;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}' 
0 0
1 11
2 22
參考解釋:定義數組a,a[0]=0,a[1]=11,a[2]=22,這時候數組a具有了三個值,01122,將數組a作爲值列表賦值給變量i做for循環,每一次循環都輸出i的值跟a[i]的值,第一次循環i=0,a[i]=a[0]=0,第二次循環i=1,a[i]=a[1]=11,第三次循環i=2,a[i]=a[2]=22,所以最後輸出的結果如上

七、awk格式化輸出

注意:awk格式化輸出的打印命令爲printf,printf()函數是格式化輸出函數,一般用於向標準輸出設備按規定格式輸出信息。
printf()函數的調用格式爲:printf(" “,);
其中格式化字符串包括兩部分內容:逗號前面的內容是格式化規定字符,以”%"開始,後面跟着的是規定字符,用來確定輸出格式,逗號後面的部分是正常字符,這些字符是按原樣輸出的。

- 左對齊
Width 域的步長,用0表示0步長
.prec 最大字符串長度,或小數點右面的位數
%c ASCII字符
%d 整型
%e 科學計數法
%f 浮點型
%g awk決定哪種浮點數轉換e或者f,自動選擇合適的表示法
%o 以八進制表示的整數
%s 字符串
%x 以十六進制表示的整數
\n 輸出新的一行,換行輸出
\r 回車
\t tab鍵

說明:
1.可以在"%"和字符之間插入數字表示最大長度。
例如:

%5s表示輸出5位字符串,不夠5位右對齊由空格補全,想要左對齊則可以用%-5s表示,左對齊,不夠5位字符串則由空格補全
%5d 表示輸出5位整型數, 不夠5位右對齊。
%8.2f 表示輸出場寬爲8的浮點數, 其中小數位爲2, 整數位爲5,小數點佔一位, 不夠9位右對齊。
如果字符串的長度、或整型數位數超過說明的場寬, 將按其實際長度輸出.但對浮點數, 若整數部分位數超過了說明的整數位寬度, 將按實際整數位輸出;若小數部分位數超過了說明的小數位寬度, 則按說明的寬度以四捨五入輸出.
若想在輸出值前加一些0, 就應在場寬項前加個0。
例如: %05s 表示在輸出一個小於5位的字符串時, 將在前面補0使其總寬度爲5位。
如果用浮點數表示字符或整型量的輸出格式, 小數點後的數字代表最大寬度,小數點前的數字代表最小寬度。
例如: %6.8s 表示顯示一個長度大於或者等於6且小於或者等於9的字符串。若大於9, 則第9個字符以後的內容將被刪除。

2.可以在"%"和格式化輸出字符之間加小寫字母l,表示輸出的是長型數
例如:

%ld表示輸出的是長型數整數
%lf表示輸出的是double浮點數

3.可以控制輸出左對齊或右對齊, 即在"%“和字母之間加入一個”-" 號可說明輸出爲左對齊, 否則爲右對齊。
例如:

%-5d 表示輸出5位整數左對齊
%-5s 表示輸出5個字符左對齊

實例:
1.輸出df -Th的命令結果的第2列和第5列,其中第2列是輸出12個字符串爲格式,不夠的空格補足,右對齊,第5列是輸出15個字符串爲格式,不夠空格補足,右對齊。

[root@redhat ~]# df -Th | awk '{printf "%12s %15s\n",$2,$5}'
          類型              可用
         xfs             16G
    devtmpfs            901M
       tmpfs            912M
       tmpfs            904M
       tmpfs            912M
         xfs            872M
       tmpfs            183M

2.輸出df -Th的命令結果的第2列和第5列,其中第2列是輸出12個字符串爲格式,不夠的空格補足,右對齊,第5列是輸出15個字符串爲格式,不夠空格補足,左對齊。

[root@redhat ~]# df -Th | awk '{printf "%-12s %-15s\n",$2,$5}'
類型           可用             
xfs          16G            
devtmpfs     901M           
tmpfs        912M           
tmpfs        904M           
tmpfs        912M           
xfs          872M           
tmpfs        183M           

3.整數換行輸出第1列:

[root@redhat ~]# echo "3.5 2.85" | awk '{printf "%d\n",$1}' 
3
[root@redhat ~]# echo "1.8 2.85" | awk '{printf "%d\t%05d\n",$1,$2}'
1       00002  //整數位不夠在整數前面用0補齊

4.浮點換行輸出第1列:

[root@redhat ~]# echo "1.3 2.85" | awk '{printf "%f\n",$1}' 
1.300000
[root@redhat ~]# echo "1.32 2.85" | awk '{printf "%f\n",$1}'
1.320000

四捨五入輸出整數:

[root@redhat ~]# echo 3.3 | awk '{printf "%.f\n",$1}'
3  //舍
[root@redhat ~]# echo 3.5 | awk '{printf "%.f\n",$1}' 
4  //入

以3位長度、1位小數,"."佔一位,浮點換行輸出第2列,小數位超過需要四捨五入:

[root@redhat ~]# echo "1.7 2.853" | awk '{printf "%3.1f\n",$2}'     
2.9 //0.853小數點後面的數字四捨五入變爲0.9

八、awk的擴展應用
1.統計Web訪問量排名
在分析Web日誌文件時,每條訪問記錄的第一列就是客戶機的IP地址,其中會有很多重複的IP地址。因此只用awk提取出這一列是不夠的,還需要統計重複記錄的數量並且進行排序。

通過awk提取信息時,利用IP地址作爲數組下標,每遇到一個重複值就將此數組元素遞增1,最終就獲得了這個IP地址出現的次數。

針對文本排序輸出可以採用sort命令,相關的常見選項爲-r、-n、-k。其中-n表示按數字順序升序排列,而-r表示反序,-k可以指定按第幾個字段來排序。

cat /var/log/httpd/access_log | awk '{IP[$1]++}END {for (i in IP){ if (IP[i]>=3) {print IP[i],i}}}' |uniq | sort -nr
9 192.168.0.12
8 127.0.0.1
#這個例子加上了if判斷,連接數大於或者等於3纔會執行
#顯示的結果前面的數字表示的是後面的ip的連接次數

2.按格式輸出每一行的倒數第二列,最後一列,總列數:
a.輸出文件每一行的倒數第二列:

[root@redhat ~]#cat a.txt | awk '{print $(NF-1)}'

b.輸出文件每一行的最後一列:

[root@redhat ~]#cat a.txt | awk '{print $(NF)}'

c…輸出文件每一行的列數:

[root@redhat ~]#cat a.txt | awk '{print NF}'

3.awk實現求和、平均值,最大值和最小值的計算操作
原文件內容:

[root@redhat ~]# cat a.txt 
12 
14
15

1.求和

[root@redhat ~]# cat a.txt | awk '{sum+=$1} END {print "Sum = ", sum}'                            
Sum =  41

2.求平均值

[root@redhat ~]# cat a.txt | awk '{sum+=$1} END {print "Average = ", sum/NR}'                     
Average =  13.6667

3.求最大值

[root@redhat ~]# cat a.txt | awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
Max= 15

4.求最小值

[root@redhat ~]# cat a.txt | awk 'BEGIN {min = 1999999} {if ($1<min) min=$1 fi} END {print "Min=", min}'  
Min= 12

5.求100以內的整數相加的和,包括100

[root@redhat ~]# seq 100 | awk '{sum+=$1} END {print "Sum = ", sum}'         
Sum =  5050

6.求100以內的整數相加的平均數,包括100

[root@redhat ~]# seq 100 | awk '{sum+=$1} END {print "Average = ", sum/NR}'                                    
Average =  50.5

7.計算/root/目錄下普通文件的大小,使用KB作爲單位:

[root@redhat ~]# ll | awk 'BEGIN{sum=0}!/^d/{sum+=$5}END{print "total size is:"sum/1024"KB"}'
total size is:353931KB

8.統計/root/目錄下不同用戶的普通文件的個數:

先查看一下/root/目錄下的文件的情況,方便等下確認結果:
[root@redhat ~]# ll
總用量 353956
-rw-------. 1 root  root       1621 87 18:56 anaconda-ks.cfg
-rw-r--r--. 1 root  root         10 821 20:52 a.txt
-rw-r--r--. 1 harry harry        19 822 10:46 b.txt
-rw-r--r--. 1 root  root          0 820 16:30 ceshi.txt
-rw-r--r--. 1 root  root       2427 816 14:05 dajihe.zip
-rw-r--r--. 1 root  root  196075027 814 17:46 Golden.apk
drwxr-xr-x. 2 root  root         35 816 10:53 harry
-rw-r--r--. 1 root  root       1188 816 11:49 harry.zip
-rw-r--r--. 1 root  root  166343742 816 11:52 jihe.zip
-rwxr-xr-x. 1 root  root       1562 814 17:47 time.sh
-rwxr-xr-x. 1 root  root        190 820 20:36 vsftp.sh

統計:
[root@redhat ~]# ll | awk 'BEGIN{print "用戶名","文件個數"}{NR!=1 && !/^d/sum[$3]++}END{for (i in sum) printf "%-8s %-8s\n",i,sum[i]}'
用戶名 文件個數
harry    1       
root     10  

9.來個大傢伙試試,輸出成績表:
原文件內容:

[root@redhat ~]# cat chengjibiao.txt 
harry 68 68 65 70
bobo 50 70 68 75
tom 45 75 75 80
mike 1 85 90 96
jack 5 80 85 90

輸出成績表:

awk 'BEGIN{math=0;eng=0;com=0;printf "Lineno.   Name    No.    Math   English   Computer    Total\n";printf "------------------------------------------------------------\n"}{math+=$3; eng+=$4; com+=$5;printf "%-8s %-7s %-7s %-7s %-9s %-10s %-7s \n",NR,$1,$2,$3,$4,$5,$3+$4+$5} END{printf "------------------------------------------------------------\n";printf "%-24s %-7s %-9s %-20s \n","Total:",math,eng,com;printf "%-24s %-7s %-9s %-20s \n","Avg:",math/NR,eng/NR,com/NR}' chengjibiao.txt 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章