AWK高级部分总结

1.awk内部变量和常量
   FS:分隔符,FS="\t+" +表示一个或多个前一个字符,FS=“foo[0-9][0-9][0-9]”表示foo后面加3位数字分割
   OFS:输出时每列的分隔符  
   NF:当前行中的字段数量
   NR:当前行号
   RS:分行符,默认为\n
   ORS:输出记录分隔符,即为print语句结尾自动打印的字符
   awk '{print "jim","tom","lilei"}' /etc/passwd 输出N多行 jim tom lilei,print中的列以“,”区分,输出结果中默认的列分隔符为空格“ ”;
   awk 'BEGIN{OFS="--"} {print "jim","tom","lilei"}' /etc/passwd 将输出N多行的jim--tom--lilei,因为在BEGIN中将输出时的列分隔符设置为了--。


例子:address.txt文件内容如下:
Jimmy the Weasel
100 Pleasant Drive
San Francisco, CA 12345

Big Tony
200 Incognito Ave.
Suburbia, WA 67890
 address.awk :
BEGIN{
  FS="\n"
  RS=""
  OFS="--"
  ORS="\n\n"
}
{
  print $1, $2, $3
}
awk -f address.awk address.txt
结果为:
Jimmy the Weasel--100 Pleasant Drive--San Francisco, CA 12345


Big Tony--200 Incognito Ave.--Suburbia, WA 67890


address.awk的作用:以"\n"即回车分列符,""空行为分行符对address.txt进行解析,输出时的列分隔符为--,行记录的分隔符为“\n\n”即2个回车


2.循环结构
do{}while(),doWhile.awk
{
     s=1
     do{
         print "the s is:" s
         s++
     }while(s<3)
}
for ,for.awk
{
    for(i=1;i<3;i++){
        print "the s is:" s
    }
}
while循环,while.awk
{
   s=1
    while(s<3){
        print "the s is :" s
        s++
    }
}
break和continue语句和c语句功能类似


3. 数组  
  awk的数组下标通常从1开始,array01.awk 
{
  myarray[1]="jim"
  myarray[2]="123"
  for(x in myarray){
    print myarray[x]
  }  
}
其中x为myarray的下标,先遍历哪一个是无序的,即结果可能是 jim 123,也可能是123 jim
awk支持字符串下标,array02.awk 
{
  myarray["name"]="jim"
  myarray["age"]="123"
  for(x in myarray){
    print "myarray[" x "]="myarray[x]
  }  
}
        查找数组中的特定下标元素可以用“in”布尔运算符,如:if("age" in myarray)
4.格式化输出
     printf(),sprintf()类似于C语言中的格式化输出。printf()会把格式化的字符串打印到stdout,而sprintf()返回格式化字符串可以赋值给变量
              {
  x=1
  b="boo"
  printf("%s got a %d on the last test\n","Jim",56)
  myout=sprintf("%s--%d",b,x)
  print myout
}


5.字符串函数          length(str),index(src,des),tolower(str),toupper(str),substr(src,index,len),match(src,regexp),sub/gsub(regexp,replstring,mystring),split(mystring,array,spit)

strFunc.awk

{
 mystring="naDTTdd you dni hao aaa you,kdnf90dd((((kdjfn"
 print "mystring=" mystring
 print "length(mystring)=" length(mystring)
 print "index(mystring,\"you\")=" index(mystring,"you")
 print "index(mystring,\"aaA\")=" index(mystring,"aaA")
 print "tolower(mystring)=" tolower(mystring)
 print "toupper(mystring)=" toupper(mystring)
 print "substr(mystring,9,3)="substr(mystring,9,3)
 print "match(mystring,/you/),RSTART,RLENGTH=" match(mystring,/you/),RSTART,RLENGTH
 print "sub(/you/,\"YOU\",mystring)="sub(/you/,"YOU",mystring)
 print "mystring=" mystring
 nums=split(mystring,myarray," ")
 print myarray[1],myarray[nums]
}
结果为:
mystring=naDTTdd you dni hao aaa you,kdnf90dd((((kdjfn
length(mystring)=45
index(mystring,"you")=9
index(mystring,"aaA")=0
tolower(mystring)=nadttdd you dni hao aaa you,kdnf90dd((((kdjfn
toupper(mystring)=NADTTDD YOU DNI HAO AAA YOU,KDNF90DD((((KDJFN
substr(mystring,9,3)=you
match(mystring,/you/),RSTART,RLENGTH=9 9 3
sub(/you/,"YOU",mystring)=1
mystring=naDTTdd YOU dni hao aaa you,kdnf90dd((((kdjfn
naDTTdd you,kdnf90dd((((kdjfn

转载于:https://my.oschina.net/zhdkn/blog/86365

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值