awk 精确搜索 逐行处理(处理n次)
格式1 前置指令 | awk [选项]'[条件]{指令}'
格式2 awk [选项]'[条件]{指令}' 文件
指令:print 输出
选项:-F 定义分隔符
默认空格 分割列
内置变量 $1 $2 $3...$0 所有列 NR行号 NF列号
awk '{print $3}' ceshi.txt
awk '/the/{print $3}' ceshi.txt
awk '/the/{print NR}' ceshi.txt
awk '{print NR}' ceshi.txt
awk '{print NF}' ceshi.txt
awk '{print $0,NR}' ceshi.txt
输出常量("")F:分隔符 输出内容
awk -F: '{print $1 ,"的解释器是",$7}' user
awk -F: '{print $1,$7}' user
收集网卡流量信息
#!/bin/bash
ifconfig eth0 | awk '/RX p/{print "服务器eth0网卡的接受流量是"$5"字节"}'
ifconfig eth0 | awk '/TX p/{print "服务器eth0网卡的发送流量是"$5"字节"}'
收集根分区剩余容量
df -h | awk '/\/$/{print "根分区剩余容量是"$4}'
awk条件
1、使用正则 ~包含 !~不包含
awk -F: '$6~/bin/{print}' user //找第6列包含bin的行
awk -F: '$6!~/bin/{print}' user //找第6列不包含bin的行
2、数字或字符串
== 相等 != 不等 >= 大于等于 > 大于 <= 小于等于 <小于
awk -F: 'NR==1{print}' user //输出第1行
awk -F: 'NR!=3{print}' user //输出除了第3行以外的行
awk -F: 'NR<4{print}' user //输出1~3行
awk -F: '$1=="root"{print}' user //输出第1列等于root的行
awk -F: '$1~/root/{print}' user //输出第1列包含root的行
逻辑组合 &&并且 || 或者 输出整行print可省略
awk -F: '$3<10&&$7~/bash/' /etc/passwd
awk -F: 'NR>=2&&NR<=6' /etc/passwd
awk -F: '$1~/root/||$2<=5' /etc/passwd
运算
awk 'NR%2==0' user 输出偶数行
2、awk处理时机---可以执行额外任务
BEING{ } 执行1次
逐行任务 { } 执行n次
END { } 执行1次
awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1 "\t"$3"\t"$6"\t"}END{print "总计"NR"行"}' user
User UID Home
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
总计5行
awk 'BEGIN{print "User\tUID\tHome"}' BEGIN任务
User UID Home
awk -F: '{print $1"\t"$3"\t"$6"\t"}' user 逐行任务
root 0 /root
bin 1 /bin
daemon 2 /sbin
adm 3 /var/adm
lp 4 /var/spool/lpd
awk 'END{print "总计"NR"行"}' user END任务
总计5行
统计网站日志访问量
systemctl restart httpd 开启服务
curl 192.168.4.7:82 访问
tail -2 /var/log/httpd/access_log 查看日志
awk '{print $1}'/var/log/httpd/access_log
awk数组加for循环实现高级搜索
数组 相当于可以存储多个值的特殊变量
数组名称[下标]=下标对应的值
awk 'BEGIN{a[1]=10;a[2]=20;print a[1]}'
awk 'BEGIN{a[1]=10;a[2]=20;print a[2]}'
awk 'BEGIN{a[1]=10;a[2]=20;print a[1],a[2]}'
数组收集信息
for循环可以循环输出数组下标
awk '{a[$1]++}END{print a["abc"],a["xyz"]}' abc.txt 收集数组的值,END任务输出值
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' abc.txt 循环,数组a的下标与值
awk '{a[$1]++}END{for(i in a){print i,a[i]}}' /var/log/httpd/access_log 查看日志,得到IP来访次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log 查看日志中IP出现次数
awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log | sort -nr 查看日志中IP出现次数,降序排列
测试
for i in {1..100}
> do
> curl 127.0.0.1:82 &> /dev/null
> done
[root@svr7 opt]# awk '{ip[$1]++}END{for(i in ip){print ip[i],i} }' /var/log/httpd/access_log | sort -nr
/var/log/secure linux系统安全文件 实时更新
awk '/Failed password for root /{print}' /var/log/secure
awk '/Failed password for root /{ip [$11]++}END{for(i in ip){print ip[i],i}}' /var/log/secure