awk命令
#命令行方式
awk [-F field-separator] 'commands' input-file(s)
#shell脚本,将所有的awk命令插入一个文件,并使awk执行
首行添加#!/bin/awk
#j将所有的awk命令插入一个单独的文件,让后调用
awk -f awk-script-file input-file(s)
内置变量
ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行 -F选项NF 浏览记录的域的个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符
awk工作流程
- 先执行BEGIN,然后读取文件,读入/n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0表示所有域,$1表示第一个域,$n表示第n个域,所有开始执行模式所对应的动作的action。接着开始读第二条记录。直到所有的记录都读完,最后执行END操作
awk编程
简单实例
# 打印第一列
#cat /etc/passwd |awk -F ':' '{print $1}'
# 打印第一列和第7列
#cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "blue,/bin/nosh"}'
#统计/etc/passwd的账户人数
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
或者
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user count is ", count}' /etc/passwd
#统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
#以M为单位ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
条件语句
ls -l |awk 'BEGIN {size=0;print "[start]size is ", size} {if($5!=4096){size=size+$5;}} END{print "[end]size is ", size/1024/1024,"M"}' [end]size is 8.22339 M
循环语句and数组
awk -F ':' 'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i < NR; i++) print i, name[i]}' /etc/passwd