awk操作符

      算术操作符:  x+y, x-y, x*y, x/y, x^y, x%y      -x: 转换为负数      +x: 转换为数值

      字符串操作符:没有符号的操作符,字符串连接

      赋值操作符: =, +=, -=, *=, /=, %=, ^=  ++, -- 

      比较操作符: ==, !=, >, >=, <, <=

          awk  -F:   ‘!($3==0) {print $1}'   /etc/passwd 

      模式匹配符:  ~ 左边是否和右边匹配包含       !~ 是否不匹配 

         awk –F:   '$0 ~ /root/{print $1}‘    /etc/passwd 

         awk  –F:  ‘$3==0’       /etc/passwd 

 

awk正则匹配表达式

   (1)如果未指定:空模式,匹配每一行 

   (2) /regular expression/:仅处理能够模式匹配到的行,需要用/  /括起来 

         awk '/^UUID/{print $1}' /etc/fstab 

   (3) relational expression: 关系表达式,结果为“真”才会被处理 

         awk  ‘!0’  /etc/passwd 

   (4) line ranges:行范围 

        startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式 

        awk -F:   ‘/^root\>/,/^nobody\>/{print $1}'    /etc/passwd 

  (5) BEGIN/END模式

       BEGIN{}: 仅在开始处理文件中的文本之前执行一次  END{}:仅在文本处理完成之后执行一次 

        

awk控制语句

   if-else   while循环  do-while循环   for循环  switch语句  break和continue 

   next:   提前结束对本行处理而直接进入下一行处理(awk自身循环) 

   awk -F: '{if($3%2!=0) next; print $1,$3}'    /etc/passwd 

   awk 自带对文件行内容的循环,awk使用循环一般是对切割数据列进行循环操作

   awk 的基本格式  awk -F:  '{}'   filepath

  

 

性能比较

    time (awk 'BEGIN{ total=0;for(i=0;i<=10000;i++){total+=i;};print total;}')

    time(total=0;for i in {1..10000};do total=$(($total+i));done;echo $total)

    time(for ((i=0;i<=10000;i++));do let total+=i;done;echo $total)

    time(seq –s ”+” 10000|bc) 

 

awk数组

      默认是关联数组

      若要遍历数组中的每个元素,要使用for循环

      for(var in array) {for-body}   注意:var会遍历array的每个索引 

 

awk函数

   数值处理: 

             rand():返回0和1之间一个随机数   awk  'BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }'  

   字符串处理: 

           echo $a | awk -F "" '{for(i=1;i<=NF;i++){if($i ~ /^[0-9]+$/) printf"%s", $i}}'

           length([s]):返回指定字符串的长度 

           sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s 

                echo "2008:08:08 08:08:08" | awk 'sub(/:/,“-",$1)' 

          gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容 

                echo "2008:08:08 08:08:08" | awk ‘gsub(/:/,“-",$0)' 

          split(s,array,[r]) 以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中, 第一个索引值为1,第二个索引值为2

               netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++} END{for (i in count) {print i,count[i]}}' 

    自定义函数

 

awk中调用shell命令 

    system命令

    空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用 空格分隔,或者说除了awk的变量外其他一律用""引用起来。 

    awk BEGIN'{system("hostname") }'   awk BEGIN'{system("ifconfig") }'

    awk 'BEGIN{score=100; system("echo  your score is " score) }' 

 awk传递值给shell循环,shell命令不能直接在awk的action中执行

#!/bin/bash
awk '/^[0-9]/{ip[$1]++}END{for(i in ip){if(ip[i]>30) print i}}' access_log | while read ip; do
      echo $ip
done 
View Code

相关文章: