Awk报告生成器
一、awk概念以及使用格式。
Awk是一个强大的报告生成器,awk自身具有遍历的功能,支持条件循环,就是一个编程语言,awk 的输出 1、print命令 后接各项目使用逗号分割,而输出时则使用输出符分割。2、输出是个字符串或数值,当记录的字段、变量或awk的表达式:数值会被隐式转换为字符串后输出。3、print后面如果省略相当于$0 输出空白print“”。4、显示当前系统上。如果print后接选项没有逗号只有空格输出的结果连载一起{print $1 $7}。
1、Awk 的变量分为内置变量和自定义变量。
FS:Field Sperator输入时字段分隔符。
#awk‘BEGIN{FS=”:”}{print $1,$7}’ /etc/passwd
RS:Record Seperator 输入时的行分隔符也就是换行符。
#awk‘BEGIN{RS=”:”}{print $1,$7}’ /etc/passwd
OFS:output filed seperator输出时字段分隔符。
# awk‘BEGIN{OFS=”:”}{print $1,$7}’/etc/passwd
ORS:OUTPUT ROW SERPERATOR输出时行分隔符。
#awk‘BEGIN{ORS=”:”}{print $1,$7}’ /etc/passwd
NF: NUMBER OF FIELD字段数。
# awk 'BEGIN{FS=":"}{print NF $1,$7}' /etc/passwd
NR:NUMBER OF RECORD行数,所有文件一并计数。
# awk‘BEGIN{FS=”:”;OFS=”:”}{print NR,$1,$7}’ /etc/passwd
FNR:多个文件时个文件分别计数。
#awk‘BEGIN{FS=”:”;OFS=”:”}{print FNR,$1,$7}’ /etc/passwd /etc/group
ARGV:数组保存命令本身这个字符。ARGC:保留awk参数的个数。
#awk‘BEGIN{print ARGV[0],ARGV[1] ARGC}’ /etc/passwd /etc/group
awk可自定义变量,其格式-v var_name = VALUE 在此变量名区分大小写。
#awk‘BEGIN{a=”Hi awk”}{print a}’ /etc/group 在此/etc/group有多少行,就会输出多少行Hi awk,如果要输出一行则#awk ‘BEGIN{a=”Hi awk”}{print a}’还可以#awk -v a=”Hi awk” ‘BEGIN{print a}’
1.2、awk的printf命令使用要点:1)要指定format;2)不会自动换行,要换行需执行\n;3)format用于为后面的每个item指定其输出格式。而format格式的指示符都是以%开头,后跟一个字符;%c:显示字符ASCII;%d,%i:十进制整数;%e,%E:科学计数法显示数值;%f:显示浮点数;%g:%G以科学计数法格式或浮点数格式显示数值;%s:显示字符串;%u:显示无字符串;%%:显示%自身。
1.2.1、%后可接修饰符:#:表示显示宽度;-:左对齐;+:显示数值的符号。例如%-10s:表示10个字符的宽度并左对齐。
#awk -F:‘{printf % “10s,%20s\n”,$1,$7}’ /etc/passwd,输出结果中间有逗号隔开当然也可以用空格隔开#awk -F: ‘{printf “%10s %20s\n”,$1,$7}’ /etc/passwd逗号换成空格即可。还可以使右边的左对齐#awk -F: ‘{printf % “10s %-20s\n”,$1,$7}’ /etc/passwd。下面看一下对浮点数的操作。
如上截图中第一行没有换行符,而二三行加入换行符,其效果一目了然,美观大方。最重要的是有保留有效位的功能。下面再来看一下%e和%f的使用。
1.2.2、awk的操作符有算数操作符+,-,*,/,%,-x(负值),+x(转换为数值)。赋值操作符:=,+=,-=,/=,%=,^=或者**=,++,--。如果模式自身是=,要写成/=/。比较操作符:,<=,>=,==,+=,!=,~:模式匹配,左边的字符串被右边的模式匹配为真,否则为假。~=:与上相反。逻辑操作符:&&,||。条件表达式:selector?if-true-expression:if-false-expression。函数调用function_name(argu1,argu2)。条件表达式应用如下。
2、awk模式
2.1 Regrexp:格式为/PATTERN/,仅处理被/PATTERN/匹配到的行。如# awk -F: ‘/root/{print $0}’/etc/passwd
2.2 Espression:表达式,其结果为非0或为非空字符串时满足条件,仅处理满足条件的,例如:# awk -F: ‘{printf “%10s %-10d\n”,$1,$3}’ /etc/passwd。
2.3 Ranges:行范围,此前地址定界,startline,endline,仅处理行范围内的行。
2.4 BEGIN/END:特殊模式,仅在awk命令的program运行之前之前(BEGIN)或运行之后(END)
2.5 Empty:空模式,匹配任意行。
3、常用action:1)表达式,比如赋值表达式,2)还可以是控制语句,3)哈可以是组合语句,4)输入语句,5)输出语句(print、printf)。
4、控制语句详解
4.1 if-else,格式 if(condition){then body} else{else body}例如:# awk -F: '{if($3>=500){print $1,"is a common user"}else{print $1,"is an admain or system user."}}' /etc/passwd。在看一例:找出/etc/inittab 中字段数大于等于8的行,# awk '{if (NF>=8) {print}}' /etc/inittab
4.2 while循环,格式:while(condtion){while body}条件为真进入循环。例如输出/etc/inittab下的奇数个字符的行# awk '{i=1;while(i<=NF){printf "%s ",$i;i+=2};print""}' /etc/inittab。
Length()函数:取字符串的长度。例如,取出/etc/inittab中字符数大于6的字符, #awk '{i=1;while (i<=NF){if (length($i)>=6){print $i};i++}}' /etc/inittab。
4.3 for循环:其格式:for(variable assignment; condition;iteration process){for body},例 # awk '{for(i=1;i<=NF;i+=2){printf "%s ",$i};print ""}' /etc/inittab则是找出/etc/inittab下奇数字符串的行。再看使用for循环取出/etc/inittab中字符数大于6的字符:# awk '{for(i=1;i<=NF;i++){if(length($i)>=6)print $i}}' /etc/inittab。for循环可以用来遍历数组元素:语法格式for(i in array){for body}。下面是一个实例# awk 'BEGIN{for(i=1;i<=5;i++){array[i] = i*2-1;}for(i in array){print i"="array[i]}}'
4=7
5=9
1=1
2=3
3=5
并没有按顺序输出。
4.4 case语句,语法格式:switch(expression){case VALUE or /RGEEXP/:stateme1;...default: staemeN}
4.5 next表示提前结束本行的处理而进入下一行的处理。例:# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd,表示不对满足条件的那一行处理。
5、数组,如果引用一个数组元素时,事先不存在,awk会自动创建元素并初始化为空串,因此要判断某数组是否存在某元素,使用index in array这种格式。如果要遍历数组中的每一个元素需要使用如下特殊结构。For(var in array){for body},# netstat -tan | awk '/^tcp/{++state[$NF]}END{for (s in state){print s state[s]}}'。
6、awk的内置函数,split(string,array[,fieldsep[,seps]])功能:将string表示的字符串以filedsep为分割符进行切片,并切片后的结果保存至array为名的数组中:例如:awk ‘BEGIN{split(“root:x:0:0”,user,”:”);for(i in user) print user[i]}’。在其内部保存user[1]为root,user[2]为x,user[3]为0,user[4]为0。