一,什么是awk
awk是linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义awk コマンドと awk プログラミング言語の詳細な紹介と例,有条件语句,有循环,有数组,有正则,有函数等。他读取输出,或者文件的方式是一行,一行的读,根据你给出的条件进行查找,并在找出来的行中进行操作,感觉他的设计思想,真的很简单,但是结合实际情况,具体操作起来就没有那么简单了。他有三种形势,awk,gawk,nawk,平时所说的awk其实就是gawk。
二,awk中的记录,域,分割符
当我们读取输出时,或者读取文件时,读取一行就是一个记录。记录分割符是默认是回车符,保存在RS,ORS中。
我们从记录中分割出我们要单词,或者是词组等,我们称他为域,域分割符,默认的是空格和TAB銉,保存在内建变
量ORS中。举个例子:
aaaa:bbbb:ccccccc
1111:2343:5t43343
上面有二行,这二行就是二个记录,每行后面的回车呢,就是记录分割符,里面冒号呢,就是域分割符,分割出来的,aaaa,1111这类东西就是域了。
awk -F: '{print $1}' testfile
三,awk的内建awk コマンドと awk プログラミング言語の詳細な紹介と例和awk コマンドと awk プログラミング言語の詳細な紹介と例
1,awk コマンドと awk プログラミング言語の詳細な紹介と例
2,awk コマンドと awk プログラミング言語の詳細な紹介と例
四,awk コマンドと awk プログラミング言語の詳細な紹介と例
五,awk的函数
1,awk コマンドと awk プログラミング言語の詳細な紹介と例
2,awk コマンドと awk プログラミング言語の詳細な紹介と例
六,实例
学习awk的时候,做了一个例子,学东西,不要光看,光看是记不住东西的。光看的话,也许你知道怎么回事,真正实际操作,不是这儿有问题,就是那儿有问题。所以一定要动手亲自操作一下。
1,测试文件test
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/bin/false daemon:x:2:2:daemon:/sbin:/bin/false mail:x:8:12:mail:/var/spool/mail:/bin/false ftp:x:14:11:ftp:/home/ftp:/bin/false &nobody:$:99:99:nobody:/:/bin/false zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash http:x:33:33::/srv/http:/bin/false dbus:x:81:81:System message bus:/:/bin/false hal:x:82:82:HAL daemon:/:/bin/false mysql:x:89:89::/var/lib/mysql:/bin/false aaa:x:1001:1001::/home/aaa:/bin/bash ba:x:1002:1002::/home/zhangy:/bin/bash test:x:1003:1003::/home/test:/bin/bash @zhangying:*:1004:1004::/home/test:/bin/bash policykit:x:102:1005:Po
例1:
cat test | awk -F: '{\ if ($1 == "root"){\ print $1;\ }else if($1 == "bin"){\ print $2;\ }else{\ print $3;\ } \ }'
例2:
awk '{\ for(i=0;i<NF;i++){\ if ($i ~/^root/){\ print $i;\ }else if($i ~/zhangy/){\ print $i;continue;\ }else if($i ~/mysql/){\ print $i;next;\ }else if($i ~/^test/){\ print $i;break;\ } \ }\ }' test
例3:
tail test | awk 'BEGIN{while(getline d){ split(d,test);for(i in test){\ print test[i]\ }}}'
例4:
ls -al /home/zhangy/mytest | awk 'BEGIN{while(getline d){ split(d,test);\ print test[9] ;} }'
例5:
echo "32:34" |awk -F: '{print "max = ",max($1,$2)}\ function max(one,two){ if(one > two){ return one; }else{ return two; } } '
例6:
#awk 'BEGIN{print "what is your name"; getline name < "/dev/tty"}$1 ~name{print #"found name on line" NR}END{print "see you" name}' test #awk '{sub(/daemon/,"tankzhang");print}' test #awk '{{sub(/zhangy/,"tankzhang");$1};print}' test #awk '{{gsub(/zhangy/,"tankzhang");$1};print}' test #awk -F: '{print index("zhangy",$1)}' test #awk -F: '{print substr($1,1,2)}' test awk -F: '{mat=match($1,/^[a-zA-Z]+$/);print mat,RSTART,RLENGTH}' test
例7:
cat test |awk -F: '\ NF != 7{\ printf("line %d,does not have 7 fields:%s\n",NR,$0)}\ $1 !~ /^[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%s: %s\n",NR,$1,$0)}\ $2 == "*" {printf("lind %d,no password:%s\n",NR,$0)}'