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 后有一个空格

  • 相关阅读:
    How to join (ap invoice distributions all) AP table info with PO Table
    Order Management APIs Oe_Order_Pub
    R12 Oe_Order_Pub API
    物料搬运单
    Process Order API In Order Management(详细)
    ap_invoice_distributions_all与PO表关联问题
    分配用人单位
    oe_order_pub 更改订单行数量,提示此更改的原因未提供或无效
    Order Management APIs
    提前期
  • 原文地址:https://www.cnblogs.com/tony3154/p/10110748.html
Copyright © 2011-2022 走看看