命令主要用法
-格式1:前置命令 | awk [選項] '[條件]{編輯指令}'
-格式2:awk [選項] '[條件]{編輯指令}' filename
常用命令選項
-F:指定分隔符,可省略(默認空格或者Tab位)
-f:調用awk腳本盡心個處理
-V:調用外部shell變量
內置變量
變量 用途
FS 保存或設置字段分隔符,如FS=":"
$n 指定分隔的第n個字段,例如$1,$4分別表示第1例,第4例
$0 當前讀入的整行文本內容
NF 記錄當前處理行的字段個數(有多少列)
FNR 記錄當前處理行在原文本內的行號
NR 記錄當前已經讀入行的數量(多個文本一起讀取時,行數累加)
FILENAME 當前處理的文件名
ENVIRON 調用shell環境變量,格式:ENVIRON["變量名"]
awk過濾的時機
BEGIN{}
讀入第一行文本之前執行
一般用來初始化操作
逐行處理{}
逐行讀入文本執行相應的處理
是最常見,用得最多的編輯指令塊
END{}
處理完最后一行文本后執行
一般用來統計或處理結果
[root@localhost ~]# awk '{print "第" FNR"行" ,"有"NF"列"}' a.txt 第1行 有2列 第2行 有4列 第3行 有2列 第4行 有3列
截取字符串前后字符
//截取007之前的字符串 [root@pgslave ~]# echo linyouyi007henshuai | awk -F '007' '{print $1}' linyouyi //截取007之前的加上007本身 [root@pgslave ~]# echo linyouyi007henshuai | awk -F '007' '{print $1 FS}' linyouyi007 //截取以007分隔符第二列 [root@pgslave ~]# echo linyouyi007henshuai | awk -F '007' '{print $2}' henshuai //截取以007分隔符,輸出包含007本身及第二列 [root@pgslave ~]# echo linyouyi007henshuai | awk -F '007' '{print FS $2}' 007henshuai
1)輸出當前用戶的UID
[root@localhost ~]# awk -F: '$1==ENVIRON["USER"]{print $3}' /etc/passwd 0
2)預處理
[root@localhost ~]# awk 'BEGIN{a=10;print a+10}' 20
3)統計使用bash的用戶數量
[root@localhost ~]# awk 'BEGIN{x=0}/\<bash$/{x++}END{print x}' /etc/passwd 1
awk處理條件概述
格式
awk [選項] '[條件]{指令}' filename
條件的表現形式
正則表達式
/正則內容/
~匹配,!~不匹配
數值/字符串比較
==,!=,>=,<=,>,<等
邏輯比較
&&邏輯與:期望多條件都成立
||邏輯或:只要有一個條件成立即滿足要求
運算符
-,+,*,/,%,++,--,+=,-=,*=,/=
1)正則內容
[root@localhost ~]# awk -F: '/^root/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash
2)~匹配,!~不匹配
[root@localhost ~]# awk -F: '$7!~/nologin/{print}' /etc/passwd root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt
3)==,!=,>=,<=,>,<等,輸出第二行文本
[root@localhost ~]# awk 'NR==2{print}' /etc/passwd bin:x:1:1:bin:/bin:/sbin/nologin
4)&&邏輯與:期望多條件都成立
[root@localhost ~]# awk -F: '$3>=0&&$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 uucp 10
5)運算符,統計文本總字段數量
[root@localhost ~]# awk -F: 'BEGIN{i=0}{i+=NF}END{print i}' /etc/passwd 140
awk流程控制
單分支
if(條件){指令}
雙分支
if(條件){指令}else{指令}
多分支
if(條件){指令}else if{指令}else{指令}
while循環
while(條件){指令}
do while
do{指令}while(條件)
for循環
for(初始值;條件;步長){指令}
1)統計UID小於或等於500的用戶個數
[root@localhost ~]# awk -F: 'BEGIN{i=0;j=0}{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd 21 1
2)統計root出現次數
[root@localhost ~]# awk -F[:/] '{i=1}{while(i<=NF){if($i~/root/){j++};i++}}END{print j}' /etc/passwd 4
3)for循環
[root@localhost ~]# awk 'BEGIN{for(i=0;i<=10;i++){print i}}' 0 1 2 3 4 5 6 7 8 9 10
數組
定義數組
格式:數組名[下標]=元素值
調用數組
格式:數組名[下標]
遍歷數組
用法:for(變量 in 數組名){print 數組名[變量]}
數組的經典使用
去除文本重復行:awk '!a[$2]++{print $2}' filename
逐行分析,遇到重復行就跳過
1)去重
[root@localhost ~]# cat a.txt 111 111 222222 22 2222 2 333333333 33 444444444444 444 44 444444444444 444 44 [root@localhost ~]# awk '!a[$2]++{print $2}' a.txt 111 22 33 444
2)列出用戶登陸shell的種類
[root@localhost ~]# awk -F: '!shell[$7]++{print $7}' /etc/passwd /bin/bash /sbin/nologin /bin/sync /sbin/shutdown /sbin/halt
3)列出用戶登陸shell的種類及個數,類似的可以統計web訪問ip及訪問次數
[root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd /bin/sync 1 /bin/bash 3 /sbin/nologin 16 /sbin/halt 1 /sbin/shutdown 1 [root@localhost ~]# awk -F: '{shell[$7]++}END{for(i in shell){print i,shell[i]}}' /etc/passwd | sort -nr -k2 /sbin/nologin 16 /bin/bash 3 /sbin/shutdown 1 /sbin/halt 1 /bin/sync 1
4)統計nginx訪問最多的ip
[root@001 nginx]$ sudo awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' access.log | sort -nr -k2 146.145.196.170 3974 111.7.10.21 15 124.25.17.151 11 47.92.114.243 9 11.7.100.24 9 111.7.100.22 8 111.7.100.20 8 106.14.217.247 8 47.92.126.167 7 11.7.100.23 7 111.7.10.19 7 111.7.100.25 6 111.7.10.18 5 111.7.100.27 4 111.7.10.26 3 80.82.70.187 2 83.143.86.62 1 80.82.78.104 1