简单的说awk是一门类似于shell的编程语言,是一种强大的文本处理工具,它的设计思想来源于 SNOBOL4 、sed 、Marc Rochkind设计的有效性语言、语言工具 yacc 和 lex ,当然还从 C 语言中获取了一些优秀的思想。
它有着属于自己的独特的语法表达方式,虽然操作可能会比较复杂,但是语法格式始终都是:
awk [options] 'program' file…
program: {pattern + action}' 或者 'pattern {action}'
pattern部分决定动作语句何时触发及触发事件
BEGIN,END
action statements对数据进行处理,放在{}内指明
print, printf
分割符、域和记录
awk执行时, 由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。 $0为所有域,注意:和shell中变量$符含义不同
文件的每一行称为记录,默认的字段分隔符就是空格
省略action,则默认执行print $0 的操作
它的基本用法如下:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] 'BEGIN{ action;… } pattern{ action;… } END{action;… }' file ...
-----------------------------------------例题解析-------------------------------------------
1.awk -F: '{if($3>1000){printf "common user:%s\n",$1"}else {printf "root or sysuser: %s\n",$1}}' /etc/passwd
2. awk -v test='hello gawk' 'BEGIN{print test}' /etc/passwd
3.awk -F: '{print name,$1;name="sysuser"}'
awk -v OFS=":" -F: '{name-"systemuser";print name,$1'} /etc/passwd
awk -v name="systemuser" -v OFS=":" -F: '{print name,$1}' /etc/passwd
4.awk -F: -f awk.txt /etc/passwd
注意动作可以写在里面文本里。
5.awk -F: 'BEGIN{print "username userid\n------------\n"}{printf "%-20s|%10d\n,$1,$3"}' /etc/passwd
6.awk -F: 'BEGIN{print "username-------------uuid"}{printf "username:%15s \t uuid:%d\n",$1,$3}' /etc/passwd
7.awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadminor SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
8. awk -F" " '/^jkj\>/,/^haha\>/{print $1,$2}' aa
9. awk -v test='hello gawk' 'BEGIN{print test}' /etc/passwd
---------------------------------------------例题进阶---------------------------------------
1.seq 10 |awk 'i=!i'
seq 10 |awk '!i'
2.seq 10 |awk 'i=!i'
seq 10 |awk '{!i;print !i}'
seq 10 |awk '{i=!i;print !i}'
3.seq 10 |awk '{!i}'
seq 10 |awk '{print !i}'
seq 10 |awk '!i'
4.seq 10 |{i=!i;print i}
5.seq 10 |awk '!(i=!i)'
seq 10 |awk -v i-=1 'i=!i'
6.awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else{printf "root or Sysuser: %s\n",$1}}' /etc/passwd
7.df -h |awk -F% '^/\/dev/{print $1}' |awk '$NF>=80{print $1 "\t" $5}'
8. awk '/^[[:space:]]*linux/{i=1;while(i<=NF){print $i,length($i);i++}}' /etc/grub2.cfg
8. awk '/^[[:space:]]*linux/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i);i++}}' /etc/grub2.cfg
9. awk 'BEGIN{i=0;print ++i,i}'
awk 'BEGIN{i=0;print i++,i}'
10.比较几种不同算法的累加和。
11.awk -F: '{line[$7]++}END{for(i in line){print i,line[i]}}' /etc/passwd
12.awk -v n=0 'n++' aa
awk -v n=0 '!n++' aa
awk -v n=0 '++n' aa
awk -v n=0 '!++n'aa
13.awk '{print !arr[$0]++}' aa
awk '!arr[$0]++' aa
14. awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}'
15.awk 'BEGIN{srand();for (i=1;i<=10;i++)print int(rand()*100)}'
16.比较sub和gsub的区别
17.netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
18.awk BEGIN'{system("hostname") }'
awk 'BEGIN{score=100; system("echo your score is " score) }'
除了列举出来的这些用法以外,awk也有自己的脚本语法,可以和shell脚本互相调用,这里就不一一列举了,那分享就到这了~~~~~~~~