一、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具有了三個值,0、11、22,將數組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 8月 7 18:56 anaconda-ks.cfg
-rw-r--r--. 1 root root 10 8月 21 20:52 a.txt
-rw-r--r--. 1 harry harry 19 8月 22 10:46 b.txt
-rw-r--r--. 1 root root 0 8月 20 16:30 ceshi.txt
-rw-r--r--. 1 root root 2427 8月 16 14:05 dajihe.zip
-rw-r--r--. 1 root root 196075027 8月 14 17:46 Golden.apk
drwxr-xr-x. 2 root root 35 8月 16 10:53 harry
-rw-r--r--. 1 root root 1188 8月 16 11:49 harry.zip
-rw-r--r--. 1 root root 166343742 8月 16 11:52 jihe.zip
-rwxr-xr-x. 1 root root 1562 8月 14 17:47 time.sh
-rwxr-xr-x. 1 root root 190 8月 20 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