awk的简单使用

来源:互联网 发布:如何给单片机烧录程序 编辑:程序博客网 时间:2024/05/17 02:28
  awk 倾向于将一行分成数个字段来处理
awk '条件类型1{动作1}条件类型2{动作2}....' filename 动作有辅助命令用;隔开
awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域, $0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或"[tab]键",所以$1表示登录用户, $3表示登录用户ip,以此类推。
last -n 5 | awk '{print $1 "\t" $3}'
cat /etc/passwd |awk  -F ':'  '{print $1}'
NF:每一行($0)拥有的字段总数
NR:目前awk所处理的是第几行数据
FS:目前的分隔符,默认是空格键
awk '{FS=":"}.....'
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割
cat /etc/passwd |awk  -F ':'  '{print $1"\t"$7}'
如果只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,而且在所有行添加列名name,shell,在最后一行添加"red,/bin/zsh"。
cat /etc/passwd |awk  -F ':'  'BEGIN {print "name,shell"}  {print $7","$1} END  {print "/bin/zsh,red"}'
awk工作流程是这样的:先执行BEGING,然后读取文件,读入有/n换行符分割的一条记录,然后将记录按 指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的 动作action。接着开始读入第二条记录······直到所有的记录都读完.最后执行END操作。
搜索/etc/passwd有root关键字的所有行,并显示对应的name,shell
awk -F: '/root/{print $1","$7}' /etc/passwd   
NF                 浏览记录的域的个数
NR                 已读的记录数
OFS                输出域分隔符
ORS                输出记录分隔符
RS                 控制记录分隔符     
ARGC               命令行参数个数
ARGV               命令行参数排列
ENVIRON            支持队列中系统环境变量的使用
FILENAME           awk浏览的文件名
FNR                浏览文件的记录数
FS                 设置输入域分隔符,等价于命令行 -F选项
 awk  -F ':'  '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF",linecontent:"$0}' /etc/passwd 
awk 'BEGIN {count=0;print "[start]user count is ", count} {count=count+1;print $0;} END{print "[end]user countis ", count}' /etc/passwd
  统计某个文件夹下的文件占用的字节数
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
统计某个文件夹下的文件占用的字节数,过滤4096大小的文件(一般都是文件夹):
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"}'
0 0