awk命令
awk和sed都可以处理文本
awk侧重于复杂逻辑处理
sed侧重于正则处理
awk和sed可以共同使用
练习文件地址
passwd :etc目录下
access.log :/usr/local/nginx/logs
awk '{print $1}' file 打印第一列内容 默认空格分割
awk -F ':' '{print $1}' file 打印第一列内容 -F设置分隔符参数,设置:分割
awk -F ':' '{print"username:"$1"\t"$2}' passwd 可以用字符串拼接打印,但是字符串需要用“”引起来。
内置函数
NR:行号
NF:字段数量
FILENAME:正在处理的文件名
awk -F ':' '{print NR"\t"NF"\t" FILENAME}' passwd
awk -F ':' '{printf("line:%s"\t" col:%s"\t"user:%s",NR,NF,$1)}' passwd 加多一个
command扩展
awk -F ':' 'BEGIN{print"line col user"}{print NR,NF,$1}END{print "-------end--------"}' passwd
例子1:显示/etc/passwd中用户名ID大于100的行
awk -F ':' '{if($3>100) print $1}' passwd ‘逻辑表达式+操作命令 ’
awk -F ':' '$3>100{print $1}' passwd ‘逻辑表达式+操作命令 ’
例子2:在服务器的日志中找出IP:192.168.174.129的访问日期
awk '/192.168.174.129/{print $4}' access.log ‘正则表达式+操作命令 ’
awk '/192.168.174.129/{print substr($4,2)}' access.log
substr函数可以截取这段数的开头和结尾,以1开头,【是1,所以用2截取
例子3:显示/etc/passwd中以m开头用户名
awk -F ':' '$1~/^m.*/{print $1}' passwd
awk -F ':' '$1!~/^m.*/{print $1}' passwd 显示不以m开头的用户名
例子4:统计当前文件夹下的文件/文件夹占用的大小
ll|awk 'BEGIN{count=0}{count+=$5}END{print count}'
ll|awk 'BEGIN{count=0}{count+=$5}END{print count/1024/1024"MB"}' 因为ll默认统计出来的是b
例子5:统计显示/etc/passwd的账户总人数
awk -F ':' 'BENGIN{count=0}$1!~/^$/{count++}END{print count}' passwd
例子6:统计显示/etc/passwd中UID大于100的用户名
awk -F ':' '$3>100{print $1}' passwd
awk -F ':' 'BEGIN{count=0}$3>100{user[count++]=$1}END{for(i=0;i<count;i++)print i,user[i]}' passwd
例子7:统计access_log日志中每个IP出现的次数
awk '{arr[$1]++}END{for(key in arr)print key,arr[key]}' access.log