awk '條件類型1 {動作1}條件類型2{動作2}...' filename
NF 每一行($0)擁有的字段總數
NR AWK所處理的是某一行的數據
FS 輸入字段分割字符,默認爲空格
RS輸入行分隔符
OFS輸出字段分隔符
ORS輸出行分隔符
FNR各自統計行
BEGIN 表示後面不帶文件 只做演示
-F 分隔符
awk –v 設置變量
NF-- 最後一列,NF-=2 最後2列
例:echo -e "1 2 3 4 5 6"|awk 'NF-=2'
例:打印passwd文件中ID小於10的用戶
cat /etc/passwd | awk -F":" ' $3<10 {print $1 "\t" $3}'
計算出每個人的總額
[root@localhost ~]# cat aa | awk 'NR==1{print $1,$2,$3,$4,"Total"}NR>=2{total=$2+$3+$4;print $1,$2,$3,$4,total}'
Name 1st 2nd 3th Total
VBird 23000 24000 25000 72000
DMTsai 21000 20000 23000 64000
Bird2 43000 42000 41000 126000
[root@localhost ~]# awk -vtest="test" 'BEGIN{print test}'
Test
或者
[root@localhost ~]# awk'BEGIN{test="test";print test}'
Test
多個語句之間要用分號;隔開
Printf
[root@localhost ~]# awk -F : '$3>500{print $1,$3}' /etc/passwd
nfsnobody 65534
www 501
mysql 502
nagios 503
aaa 504
打印出passwd文件中ID大於500的用戶
[root@localhost ~]# awk -F :'$7~"bash$" {print $1,$7}' /etc/passwd
root /bin/bash
chen /bin/bash
nagios /bin/bash
打印出第七列以bash結尾的用戶
awk -F : '$7!~"bash$" {print$1,$7}' /etc/passwd 取反
[root@localhost ~]# awk -F : '/^r/ {print$1,$7}' /etc/passwd
root /bin/bash
rpc /sbin/nologin
rtkit /sbin/nologin
rpcuser /sbin/nologin
去以r開頭的行
[root@localhost ~]# awk -F : '/^r/,/^m/ {print$1,$7}' /etc/passwd 第一個r開頭的行到第一個m開頭的行
[root@localhost ~]# awk -F:'$3==0,$7~"bash$"{print $1,$7}' /etc/passwd
root /bin/bash
取ID=0和第七列以bash結尾的行
[root@localhost ~]# awk -F:'$3==0,$7~"nologin"{printf "%-10s%-10s%-20s\n",$1,$3,$7}'/etc/passwd
root 0 /bin/bash
bin 1 /sbin/nologin
取第三列=0和第七列以nologin結尾的值打印$1 $3 $7 "%-10s%-10s%-20s\n"表示中間隔多少字符串
BEGIN/END awk執行前執行一次和awk執行後執行一次
[root@localhost ~]# awk -F: 'BEGIN{print "username ID shell"}$3==0,$7~"nologin"{printf"%-10s%-10s%-20s\n",$1,$3,$7}' /etc/passwd
username ID shell
root 0 /bin/bash
bin 1 /sbin/nologin
AWK執行前 打印出三列的表頭
[root@localhost ~]# awk -F: 'BEGIN{print"username ID shell"}$3==0,$7~"nologin"{printf "%-10s%-10s%-20s\n",$1,$3,$7}END{print "End of file"}' /etc/passwd
username ID shell
root 0 /bin/bash
bin 1 /sbin/nologin
End of file
AWK執行後 打印出結束語
[root@localhost ~]# awk -F: '{if($1=="root") print $1 , "this is admin";else print$1,"no admin"}' /etc/passwd
root this is admin
bin no admin
daemon no admin
adm no admin
if語句 如果$1=root則顯示$1爲this isadmin 否則顯示no admin
[root@localhost ~]# awk -F: -v sum=0 '{if($3>500) sum++}END{print sum}' /etc/passwd
5
-v 變量sum賦值爲0 如果ID大於500 則sum+1 執行完成後顯示sum的值
netstat -ant | awk'/^tcp/{state[$NF]++}END{for (s in state) {print s,state[s]}}'
查看TCP狀態
[root@localhost ~]# awk'{count[$1]++}END{for (ip in count) {print ip,count[ip]}}'/home/webserver/nginx/logs/access.log
統計網站每個IP訪問量
另:文件比較工具 diff
diff參數用法
-b 忽略一行當中的空格
-B 或略空白行
-i 忽略大小寫的不同
用法:diff [-bBi] 文件1 文件2即可 (也可比較目錄)