步骤一:awk的基本用法
1)基本操作方法
格式1:awk [选项] '[条件]{指令}' 文件
格式2:前置指令 | awk [选项] '[条件]{指令}'
其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
处理文本时,默认将空格、制表符作为分隔符。
条件可以用/ /的方式,与sed类似
awk常用内置变量:
$0 文本当前行的全部内容
$1 文本的第1列
$2 文件的第2列
$3 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
- [root@svr5 ~]# cat abc.txt
- hello the world
- welcome to beijing
- awk '{print}' abc.txt #输出所有
- awk '/to/{print}' abc.txt #输出有to的那行
- awk '{print $2}' abc.txt #输出所有行的第2列
- awk '/to/{print $1}' abc.txt #输出有to的那行的第1列
- awk '{print $0}' abc.txt #输出所有行所有列
- awk '{print $0,$1}' abc.txt #输出所有行所有列,第1列
- awk '{print NR}' abc.txt #输出所有行的行号
- awk '{print NR,$0}' abc.txt #输出所有行的行号,所有列
- awk '{print NR,NF}' abc.txt #输出所有行的行号,列号(有几列)
选项 -F 可指定分隔符
- awk -F: '{print $1}' user #文档中如果没有空格,可以用F修改分隔符
- awk -F: '{print $1,$6}' user #使用冒号作为列的分隔符,显示第1、6列
awk的print指令不仅可以打印变量,还可以打印常量
- awk -F: '{print $1" 的家目录是 "$6}' user #输出常量,加双引号即可
格式化输出信息
- awk [选项] '[条件]{指令}' 文件
- awk [选项] 'BEGIN{指令} {指令} END{指令}' 文件
- BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
- { } 逐行处理,读取文件过程中执行,指令执行n次
- END{ } 行后处理,读取文件结束后执行,指令执行1次
- awk -F: 'BEGIN{print "start"}{print $1}END{print "over"}' user
- awk 'BEGIN{print NR}{print NR}END{print NR}' user
输出信息时,可以使用"\t"显示Tab制表位:
- awk -F: 'BEGIN{print "User\tUID\tHome"}{print $1"\t"$3"\t"$6}END{print "总计"NR"行"}' user #合在一起写
步骤一:认识awk处理条件的设置
使用正则设置条件
/正则/ ~ 包含 !~不包含
- awk -F: '$6~/root/{print}' user #输出第6列包含root的行
- awk -F: '$6~/bin/{print}' user #输出第6列包含bin的行
- awk -F: '$6!~/bin/{print}' user #输出第6列不包含bin的行
定义数组的格式:数组名[下标]=元素值
调用数组的格式:数组名[下标]awk 'BEGIN{a["abc"]="abcabc";a["xyz"]="xyzxyz";print a["xyz"]}'
- awk '{a[$1]++}END{for(i in a){print i,a[i]}}' shu.txt #使用逐行任务与数组收集文档shu.txt中的信息,然后在END任务中使用for循环显示所有数组a的下标与值
:统计Web访问量排名
通过awk提取信息时,利用IP地址作为数组下标,每遇到一个重复值就将此数组元素递增1,最终就获得了这个IP地址出现的次数。
针对文本排序输出可以采用sort命令,相关的常见选项为-r、-n、-k。其中-n表示按数字顺序升序排列,而-r表示反序,-k可以指定按第几个字段来排序
awk '{ip[$1]++}END{for(i in ip){print ip[i],i}}' /var/log/httpd/access_log | sort -nr
/var/log/secure是安全日志,如果有人登陆时输入错误密码的话信息会记录下来,这种信息可以用awk抓取出来,方法如下:
- awk '/Failed password for root/{ip[$11]++}END{for(i in ip){print i,ip[i]}}' /var/log/secure #统计安全日志中访问root账户且密码输入错误的ip地址与次数