zoukankan      html  css  js  c++  java
  • awk

    awk变量

      变量:内置和自定义变量

      FS:输入字段分隔符,默认为空白字符

         awk -v FS=':' '{print $1,FS,$3}’ /etc/passwd

         awk –F: '{print $1,$3,$7}’ /etc/passwd

       OFS:输出字段分隔符,默认为空白字符

         awk -v FS=‘:’ -v OFS=‘:’ '{print $1,$3,$7}’ /etc/passwd

       RS:输入记录分隔符,指定输入时的换行符 

        awk -v RS=' ' ‘{print }’ /etc/passwd

      ORS:输出记录分隔符,输出时用指定符号代替换行符

        awk -v RS=' ' -v ORS='###'‘{print }’ /etc/passwd

      NF:字段数量

        awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$

        awk -F: '{print $(NF-1)}' /etc/passwd

        NR:记录号

        awk '{print NR}' /etc/fstab ; awk END'{print NR}' /etc/fstab

      FNR:各文件分别计数,记录号

        awk '{print FNR}' /etc/fstab /etc/inittab

      FILENAME:当前文件名

        awk '{print FILENAME}’ /etc/fstab

      ARGC:命令行参数的个数

        awk '{print ARGC}’ /etc/fstab /etc/inittab

        awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab

      ARGV:数组,保存的是命令行所给定的各参数

        awk ‘BEGIN {print ARGV[0]}’ /etc/fstab  /etc/inittab

        awk ‘BEGIN {print ARGV[1]}’ /etc/fstab  /etc/inittab

    自定义变量(区分字符大小写)

      (1) -v var=value

      (2) 在program中直接

      示例:

        awk -v test='hello gawk' '{print test}' /etc/fstab

        awk -v test='hello gawk' 'BEGIN{print test}'

        awk 'BEGIN{test="hello,gawk";print test}' 

        awk –F:‘{sex=“male”;print $1,sex,age;age=18}’  /etc/passwd

    格式化输出:printf “FORMAT”, item1, item2, ...

      (1) 必须指定FORMAT  

      (2) 不会自动换行,需要显式给出换行控制符,

      (3) FORMAT中需要分别为后面每个item指定格式符

    格式符:与item一一对应

      %c: 显示字符的ASCII码

      %d, %i: 显示十进制整数
      %e, %E:显示科学计数法数值
      %f:显示为浮点数
      %g, %G:以科学计数法或浮点形式显示数值
      %s:显示字符串
      %u:无符号整数
      %%: 显示%自身

    修饰符:

      #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
      -: 左对齐(默认右对齐) %-15s
      +:显示数值的正负符号 %+d

    逻辑操作符:与&&,或||,非!

    示例:

      awk –F: '$3>=0 && $3<=1000 {print $1}' /etc/passwd

      awk -F: '$3==0 || $3>=1000 {print $1}' /etc/passwd

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

      awk -F: ‘!($3>=500) {print $3}’ /etc/passwd

    函数调用: function_name(argu1, argu2, ...)

    条件表达式(三目表达式):

      selector?if-true-expression:if-false-expression

      示例:

        awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s ",$1,usertype}' /etc/passwd

    awk '!arr[$0]++'   file    文件内的行去重

    awk '{ip[$1]++}END{for(i in ip)print i ip[i]}  /var/log/httpd/access_log    统计每个IP连接的次数

    ss -nt | awk -F "[ :]+" '/ESTAB/{print $(NF-2)}' |sort | uniq -c |sort -nr |head -n3|while read count ip;do

    >iptables -A INPUT -s $ip -j REJEACT;done

    或者:

    ss -nt |awk -F "[ :]+" '/ESTAB/{IP[$(NF-2)]++}END{for(i in IP){if(IP[i]>3)system("iptables -A INPUT -s "i" -j REJECT")}}'

    将连接数超过3个的连接加入防火墙拒绝名单

    while read count ip    这里出现两个变量,分别对应里面的计数和IP地址,如果需要while read后面可以加更多的变量

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

    awk '{for(i=1;i<=NF;i++)word[$i]++}END{for(i in word)print word[i],i}' /etc/profile|sort -nr

    awk '{num[$3]++;sum[$3]+=$2}END{for(sex in num){print sex,num[sex],sum[sex]/num[sex]}}' f1 

    [root@192 ~]# cat f1
    mage 100 male
    wang 90 male
    zhang 85 female
    mo 99 female

    num[$3]++ 统计出现次数
    sum[$3]+=$2 统计男性和女性各自的总分
    print sex 打印 male或female
    print num[sex] 打印各有几个男性和女性
    print sum[sex]/num[sex]}}' 打印平均分

    awk 'BEGIN{name="mage";system("echo "name)}'         name为awk的变量,不能和echo 在一个双引号下,注意!!echo 后有一个空格

  • 相关阅读:
    一些你可能用到的代码
    iOS 键盘下去的方法
    iOS设计模式汇总
    随笔
    Spring cloud config 分布式配置中心 (三) 总结
    Spring cloud config 分布式配置中心(二) 客户端
    Spring cloud config 分布式配置中心(一) 服务端
    jdbcUrl is required with driverClassName spring boot 2.0版本
    JpaRepository接口找不到 spring boot 项目
    解决IntelliJ “Initialization failed for 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/tony3154/p/10110748.html
Copyright © 2011-2022 走看看