awk 参数 ‘模式{动作}’ 文件
awk 参数 ‘条件(找谁){干啥}’ 文件
常用: -F 指定分隔符 取列,默认空格为分隔符
awk正则表达式
符号 | 表达含义 |
---|---|
* | 与前面的正则表达式的零个或多个出现匹配 |
. | 匹配任何单个字符 |
\ | 转义随后的特殊字符 |
+ | 匹配前面的正则表达式的一次或多次出现 |
^ | 作为正则表达式的第一个字符,表示匹配行的开始,以什么开头 |
$ | 作为正则表达式的最后一个字符,表示匹配行的结尾 |
? | 匹配前面的正则表达式的零次或一次出现 |
{n,m} | 匹配它前面某个范围内单个字符出现的次数,{n}将匹配n次出现,{n,}至少匹配n次出现,{n,m}匹配n和m之间的任意次出现 |
1.awk取行,匹配文件内容:
- awk -F":" '{print $1 " " $3}' /etc/passwd $1与$3之间手动添加空格分隔
- awk '/ljc/' file 显示文件file中包含ljc的匹配行。
- awk '!/ljc/' file 显示文件file中不包含ljc的匹配行。
- awk '/起始内容/,/终止内容/' file 取包含内容的区间行区间匹配
- awk '/halt|sync/' file 匹配halt或者sync的行
- awk 'NR>=5 && NR<=10' file 取5到10行,逻辑与
- awk -F: '$1~/mail/ || $3>1 {print }' /ljc 取$1或者mail或者$3>1的行,逻辑或
2.awk中的替换:
替换但不修改文件内容:
gsub(/目标/,"替换为什么",第几列)
gsub(/目标/,"替换为什么") == gsub(/目标/,"替换为什么",$0)
例:
[root@ljc ~]# awk 'gsub(/halt/,"tihuang")' liangjc.txt
3.BEGIN{} 模块计算
END{} 模块awk读取文件之后执行,先计算,最后END{}显示结果
数组运算一些常用例子
例1:分析access.log中每个ip地址出现的次数
[root@ljc~]# awk '{h[$1]++}END{for(p in h) print p""h[p]}' access.log|sort -rnk2|head|column -t
58.220.223.62 12
112.64.171.98 14
114.83.184.139 122
例2:分析access.log中每个ip地址使用的流量总数
i=i+$10 === i+=$10
[root@ljc~]# awk '{h[$1]+=$10}END{for(p in h) print p,h[p]/1024^2"MB"}' access.log |sort -rnk2|head |column -t
114.83.184.139 29.91MB
117.136.66.10 21.3922MB
116.216.30.47 20.4716MB
例3:分析secure文件中每个用户被破解的次数:
破解root用户的次数
[root@ljc~]# awk '/Failedpassword/{if($(NF-5)=="root")i++}END{print i}' secure-20181219
3283
例4:分析secure文件中每个ip地址破解你的次数
[root@ljc ~]# awk '/Failedpassword/{h[$(NF-3)]++}END{for(p in h) print p" "h[p]}' secure-20181219|sort-rnk2|column -t|head
218.65.30.25 68652
218.65.30.53 34326
例5:分析secure文件中每个用户被每个ip破解的次数
[root@ljc ~]# awk '/Failedpassword/{h[$(NF-5)" "$(NF-3)]++}END{for(p in h) print p""h[p]}' secure-20181219|sort -rnk3|column -t|head -20
root 218.65.30.25 68652
root 218.65.30.53 34326
root 218.87.109.154 21201
例6:分析access.log文件中每个ip地址的访问次数与每个ip地址使用的流量总数:
1)ip地址使用的流量总数
[root@ljc ~]# awk '{h[$1]++;h[$1]+=$10}END{for(p in h)print p" "h[p]/1024^2"MB"}' access.log|column -t|sort-rnk2|head
114.83.184.139 29.9119MB
117.136.66.10 21.3937MB
2)ip地址的访问次数
[root@ljc ~]# awk '{h[$1]""h[$1]++;s[$1]+=$10}END{for(t in h) print t" "h[t]}' access.log|column-t|sort -rnk2|head
58.220.223.62 12049
112.64.171.98 10856
3)每个ip地址的访问次数与每个ip地址使用的流量总数
[root@ljc ~]# awk '{h[$1]""h[$1]++;s[$1]+=$10}END{for(t in h) print t" "h[t]""s[t]/1024^2"MB"}' access.log|column -t|sort -rnk2|head
58.220.223.62 12049 12.0192MB
112.64.171.98 10856 14.5483MB