-----------awk命令-----------
说明:
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
有三种方式调用awk
1.命令行方式
awk [-F field-separator] 'commands' input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。
通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
2.shell脚本方式
将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
相当于shell脚本首行的:#!/bin/sh
可以换成:#!/bin/awk
格式为: ./awk脚本文件 输入文件
3.插入文件方式
将所有的awk命令插入一个单独文件,然后调用:
awk -f awk-script-file input-file(s)
awk -f awk脚本文件 输入文件
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
- ARGC 命令行参数个数
- ARGV 命令行参数排列
- ENVIRON 支持队列中系统环境变量的使用
- FILENAME awk浏览的文件名
- FNR 浏览文件的记录数
- FS 设置输入域分隔符,等价于命令行 -F选项
- NF 浏览记录的域的个数
- NR 已读的记录数
- OFS 输出域分隔符
- ORS 输出记录分隔符
- RS 控制记录分隔符
例:
last -n 5 |awk '{print $1}'
#显示最近登录的5个账号。
cat /etc/passwd |awk -F ':' '{print $1}'
#显示/etc/passwd的账户。
cat /etc/passwd |awk -F ':' '{print $1 "\t" $7}'
#显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以tab键分割。
cat /etc/passwd |awk -F ':' 'BEGIN {print "name,shell"} {print $1 "," $7} END{print "这里结束了"}'
#只是显示/etc/passwd的账户和账户对应的shell,而账户与shell之间以逗号分割,
#而且在所有行添加列名name,shell,在最后一行打印“这里结束了”。
awk -F: '/root/' /etc/passwd
#搜索/etc/passwd有root关键字的所有行。
awk -F ':' '/root/{print $7}' /etc/passwd
#搜索/etc/passwd有root关键字的所有行,并显示对应的shell。
awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd
#统计/etc/passwd文件名,每行的行号,每行的列数,对应的完整内容。
awk -F ':' '{printf("filename:%s,linenumber:%s,columns:%s,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
#使用printf替代print,可以让代码更加简洁,易读。
awk '{count++;print $0;} END{print "user count is ", count}' /etc/passwd
#统计/etc/passwd的账户人数,count是自定义变量。
awk 'BEGIN {count=0;print "start usr count is ", count} {count=count+1;print $0;} END{print "end user count is", count }' /etc/passwd
#初始化count,虽然默认是0,但是妥当的做法还是初始化为0。
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "end size is ", size}'
#统计某个文件夹下的文件占用的字节数。
ls -l |awk 'BEGIN {size=0;} {size=size + $5;} END{print "end size is", size/1024/1024 "M"}'
#同上,以M为单位显示;注意,统计不包括文件夹的子目录。
awk -F ':' 'BEGIN {count=0;} {name[count] = $1; count++;}; END{for(i=0; i < NR; i++) print i, name[i]}' /etc/passwd #显示/etc/passwd的账户。
awk -F ':' '$1~/root/ {OFS="#";print $1,$2}' 1.txt
#第一个段匹配root的行,并以#作为分隔符输出结果。
awk -F ':' '$1=="root" || NR>20 {OFS="#";print $1,$2}' 1.txt
#匹配root或者行号大于20的行的结果。
awk -F ':' '$1=$3+$4 {print}' 1.txt
#把第一段用第3和第4段的和的结果表示,并打印出全部结果。
awk -F ':' 'NF >3 && NF<10 {print}' 1.txt
#显示分段数量在3-10之间的结果。