• shell编程awk进阶


    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

    awk脚本

         将awk程序写成脚本,直接调用或执行 

         向awk脚本传递参数 

         格式:  awkfile  var=value var2=value2... Inputfile 

         注意:在BEGIN过程中不可用.直到首行输入完成以后,变量才可用.可以通 过-v 参数,让awk在执行BEGIN之前得到变量的值.

                   命令行中每一个指定的变 量都需要一个-v参数 

      

     awk实例

      ./numgen.sh 3 4  |   grep -v "^$"    |   awk '{sum=0;for(i=1;i<=NF;i++){sum+=$i}; if($1>sum/NF){print NR}}'

     1 awk '{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}' /etc/rc.sysinit
     2 
     3 [root@centos7 ~]# awk '{if($NF=="m"){sum_m+=$2;num_m++} else{sum_f+=$2;num_f++}}END{printf "male:%.2f
    female:%.2f
    ",sum_m/num_m,sum_f/num_f}' score
     4 male:99.50
     5 female:95.00
     6 [root@centos7 ~]# awk '{pcount[$3]++;s[$3]+=$2}END{for(i in pcount){print i, pcount[i],s[i]/pcount[i]}}' score
     7 m 2 99.5
     8 f 2 95
     9 [root@centos7 ~]# echo "2008:08:08 :08" | awk 'sub(/:/,"-",$1)'
    10 2008-08:08 :08
    11 [root@centos7 ~]# echo "2008:08:08 :08" | awk 'gsub(/:/,"-",$1)'
    12 2008-08-08 :08
    13 [root@centos7 ~]# echo "2008:08:08:08" | awk 'gsub(/:/,"-",$1)'
    14 2008-08-08-08
    15 [root@centos7 ~]# head -n1 /etc/passwd | awk '{split($0,arr,":")}END{for(i in arr){print i,arr[i]}}'
    16 4 0
    17 5 root
    18 6 /root
    19 7 /bin/bash
    20 1 root
    21 2 x
    22 3 0
    23 [root@centos7 ~]# netstat -an |awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
    24 192.168.33.1 2
    25 0.0.0.0 5
    View Code
     1 awk -F: -v i=0 'i{print $0}' /etc/fstab
     2 [root@centos7 ~]# awk '/^[^#]/' /etc/fstab
     3 UUID=1ec9c7b3-bec1-4998-9aad-057423419431 /                       xfs     defaults        0 0
     4 UUID=df74adc0-09cd-4a97-a1e4-9f0d4a4b5796 /boot                   xfs     defaults        0 0
     5 UUID=bacf4f88-3be9-4e74-ba5b-90274a2099ab /data                   xfs     defaults        0 0
     6 UUID=339ab167-206a-4210-a36d-8d575579959e swap                    swap    defaults        0 0
     7 [root@centos7 ~]# awk '/^ *#/' /etc/fstab
     8 #
     9 # /etc/fstab
    10 # Created by anaconda on Wed Mar 28 01:53:52 2018
    11 #
    12 [root@centos7 ~]# awk -F: '//bin/bash$/{print $1,$NF}' /etc/passwd
    13 root /bin/bash
    14 yanxianghui /bin/bash
    15 tomcat /bin/bash
    16 [root@centos7 ~]# awk -F: '/^root>/,/^mail>/{print $1}' /etc/passwd
    17 root
    18 [root@centos7 ~]# df -h | awk -F% '$0 ~ /^/dev/sd/{print $1}'| awk '$5>=10'
    19 /dev/sda1      1014M  194M  821M  20
    20 [root@centos7 ~]# df -h | awk -F% '$0 ~ /^/dev/sd/{print $1}'
    21 /dev/sda2        50G  4.2G   46G   9
    22 /dev/sda3        30G   82M   30G   1
    23 /dev/sda1      1014M  194M  821M  20
    View Code
    1 [root@centos7 ~]# awk '/^[0-9]/{ip[$1]++}END{for (i in ip){print i,ip[i]}}' access_log 
    2 172.20.101.111 2
    3 172.20.101.238 19
    4 172.20.101.188 6
    View Code
  • 相关阅读:
    java获取指定文件夹下的所有文件名
    org.dom4j.DocumentException: unknown protocol: d Nested exception: unknown
    如何在spring中获取request对象
    Java获取文件后缀名
    解析XML并将信息封装到对象中
    在web项目启动时执行某个方法
    Maven Dependencies没有了的解决办法
    B-树(B+树) 学习总结
    Netty学习笔记之一(Netty解析简单的Http Post Json 请求)
    用到的设计模式总结--单例模式+工厂方法模式+Builder模式
  • 原文地址:https://www.cnblogs.com/yxh168/p/9048107.html
Copyright © 2020-2023  润新知