格式:
awk [选项] 'BEGIN{指令} {指令}END{指令}' 文件 BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次 { } 逐行处理,读取文件过程中执行,指令执行n次 END{ } 行后处理,读取文件结束后执行,指令执行1次 【先为x赋值为0,然后进行++最后输出x】 [root@desktop0 ~]# awk 'BEGIN{x=0} /bash$/{x++}END{print x}' /etc/passwd 2 [root@desktop0 ~]# awk '/bash$/{x++}END{print x}' /etc/passwd 【默认0开始】 4【按顺序列出用户名,uid,家目录,总和】
[root@desktop0 ~]# awk -F: 'BEGIN{print "yong" "UID" "jia" "zong" } {print $1,$3,$6}END{print "zong"NR }' /etc/passwd |column -t column -t 【自动对齐】六)awk处理条件
1.使用正则设置条件 【模糊匹配】 /正则/ 在一整行里匹配 $n~/正则/ $1~/正则/ $2~/正则/ 【第一列包括和第二列包括。。。】 $n!~/正则/ 取反 [root@desktop0 ~]# awk -F: '$7!~/nologin$/' /etc/passwd 2.字符和数字的比较 == != > >= < <= 【精准匹配】 【打印出第1行的第一列】 awk -F: 'NR==1{print $1}' /etc/passwd 【打印UID大于等于1000的第1和第3列】 [root@desktop0 ~]# awk -F: '$3>=1000{print $1,$3}' /etc/passwd nfsnobody 65534 student 1000 jiajia 1001 【精确查找第一列是root的行】 [root@desktop0 ~]# awk -F: '$1=="root"' /etc/passwd root:x:0:0:root:/root:/bin/bash 【300中能被3整除的数】 [root@desktop0 ~]# seq 300 | awk '$3%==0' 【300中能被3整除并包含3的数】 [root@desktop0 ~]# seq 300 | awk '$1%3==0&&$1~/3/' 3.逻辑测试条件: && 和 || 【打印UID大于10小于20的行】 [root@desktop0 ~]# 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 【打印UID等于10的行若没有则打印UID等于1000的行】 [root@desktop0 ~]# awk -F: '$3==10||$3==1000' /etc/passwd student:x:1000:1000:Student User:/home/student:/bin/bash 4.单双分支 awk [选项] '[条件]{指令}' 文件 if语句 if(判断){指令} if(判断){指令}else{指令} 单分支 [root@desktop0 ~]# awk -F: '{if($3>1000){x++}} END{print x}' /etc/passwd 双分支 [root@desktop0 ~]# awk -F: '{if($3>1000){x++}else{y++}} END{print x,y}' /etc/passwd 3 38 5.数组:一个可以存储多个值的变量 [root@desktop0 ~]# x=(11 22 33) [root@desktop0 ~]# y[0]=11 [root@desktop0 ~]# y[1]=22 [root@desktop0 ~]# y[2]=33 [root@desktop0 ~]# echo ${x} 11 [root@desktop0 ~]# echo ${x[1]} 22 [root@desktop0 ~]# echo ${y} 11 awk 数组: [root@desktop0 ~]# awk 'BEGIN{x[0]=11;x[2]=22;print x[2],x[0]}' 22 11 【当数组多时,利用for循环读出】 [root@desktop0 ~]# awk 'BEGIN{x[0]=12;x[1]=35;x[2]=45;x[3]=456;for(i in x){print x[i]}}' 12 35 45 456 扩展:常见的低成本攻击 【DOS攻击 deny of service】 ab -c 100 -n 100000 http://172.25.0.10/ 模拟有100人上网,访问网站10w次应对方法:
【查看异常:列出IP的访问次数】 [root@desktop0 ~]# awk '{a[$1]++}END{for(i in a){print a[i],i}}' /var/log/httpd/access_log | sort -n 10 ::1 26141 172.25.0.250 sort -n 排序