• awk使用教程


    gawk - pattern scanning and processing language
    基本用法:gawk [options] 'program' FILE ...
    program:PATTERN{ACTION STATEMENTS}
    语句之间用分号分隔

        print,printf
        选项:
                -F:指明输入时用到的字段分隔符;
                -v var=value:自定义变量
    
        1、print
                print item1,item2,...
                要点:
                1.逗号分隔符;
                2.输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
                3.如省略item,相当于print $0; 
        2、变量
                内建变量:
                        FS:input field seperator,默认为空白字符;
                        OFS:output field seperator,默认为空白字符;
                        RS:input record seperator,输入的换行符
                        ORS:output record seperator,输出时的换行符;
                        NF:number of field,每一行的字段数量
                        NR:number of record,行数
                        FNR:file number of record,行文件分别计数;
                        FILENAME:当前文件名;
                        ARGC:命令行参数的个数;
                        ARGV:数组,保存的是命令行所给定的各参数;
                自定义变量:
                        1.-v var=value
                        2.在program中直接定义
        3、printf命令
                格式化输出:printf FORMAT,item1,item2
                (1) FORMAT必须给出
                (2) 不会自动换行,需要显式给出换行控制符,
    
                (3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
                格式符:
                        %c:显示字符的ASCII码
                        %d,%i:显示为十进制整数
                        %e,%E:显示为科技计数法
                        %f:显示为浮点数
                        %g,%G:以科学计数法或浮点形式显示数值
                        %s:显示字符串
                        %u:无符号整数
                        %%:显示%自身
                修饰符:
                        #[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度
                                %3.1f
                        -:左对齐
                        +:显示数值的符号
        4、操作符
                算术运行:
                        x+y,x-y,x*y,x/y,x^y,x%y
                        -x
                        +x:把字符串转换为数值
                字符串操作符:没有符号的操作符,字符串连接
                赋值操作符:
                        =,+=,-=,*=,/=,%=,^=
                比较操作符:
                        >,>=,<,<=,!=,==
                模式匹配:
                        ~:是否匹配
                        !~:是否不匹配
                逻辑操作符:
                        &&
                        ||
                        !
                函数调用:
                        function_name(argu1,argu2...)
                条件表达式:
                        selector?if-true-expression:if-false-expression
        5、PATTERN
                (1) empty:空模式,匹配每一行;
                (2) /regular expression/:仅处理能够被此处的模式匹配到的行;
                (3) !/regular expression/:对模式取反;
                (4) relational expression:关系表达式,结果有“真”有“假”,结果为“真”才被处理;
                        真:结果为非0值,非空字符串
                (5) line ranges:行范围
                        startline,endline,不支持
                        /pat1/,/pat2/
                        (NR>=2&&NR<=10) 
                (6) BEGIN/END模式
                        BEGIN{}:仅在开始处理文件中的文本之前执行一次;
                        END{}:仅在文本处理完成之后命令结束之前执行一次;
        6、常用action
                (1) Expressions;
                (2) Control statements:if,while等; 
                (3) Compound statements:组合语句;
                (4) input statements
                (5) output statements
        7、控制语句
                if(condition) {statements}
                if(condition) {statements} else {statements}
                while(condition) {statements}
                do {statements} while(condition)
                for (expr1;expr2;expr3) {statements}
                break
                continue
                delete array[index]
                delete array
                exit
                {statements}
    
                7.1 if-else
                        语法:if(condition) statement [else statement]
                        # awk -F: '{if($3>=1000) {printf "Common user:%20s
    " $1} else { printf "root or Sysuser:%20s
    ",$1}}' /etc/passwd
                        #awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
                        #awk '{if(NF>=5) print $0}' /etc/fstab
                        #df -h | awk -F[%] '//dev/{print $1}' | awk '{if($NF>=80) print $NF}'
                        使用场景:对awk取得的整行或某个字段做判断
                7.2 while 循环
                        语法 while (condition) statement
                                条件“真”,进入循环:条件“假”,退出循环
    
                        使用场景:对一行内多个字段进行类似处理时使用;
                        #awk '/^[[:space:]]*linux16/   {i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
                7.3 do-while 循环
                        语法:do statement while (condition)
                        意义:至少执行一次循环体
                7.4 for 循环
                        语法:for (expr1;expr2;expr3) statement
                        for(variableassignment;condition;iteration process) {for-body}
                        # awk '/^[[:space:]]*linux16/ { for (i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
                        特殊用法:
                                能遍历数组中的元素:
                                语法 for (var in array) {for-body}
    
                7.5 switch 语句
                        语法:switch(expression){case VALUE1 or /REGEXP:statment;case VALUE2 or /REGEXP2/: statement;...;default:statement} 
                7.6 break 和 continue
                        break [n]
                        continue 
                7.7 next 
                        提前结束本行的处理,直接进入下一行
                        # awk -F: '{if ($3%2!=0) next;print $1,$3}' /etc/passwd
        8、array 
                关联数组:array[index-expression]
                index-expression:
                        (1) 可使用任意字符串;
                        (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素并将其值初始化为空;
                        要判断数组中是否存在某元素,要使用"index in array"格式进行
                        weekdays[mon]="Monday"
                        # awk 'BEGIN {weekdays["mon"]="Monday";weekdays["tue"]="Tuesday" ;print weekdays["mon"]}'
    
                        若要遍历数组中每个元素,使用for循环
                        # awk 'BEGIN {weekdays["mon"]="Monday";weekdays["tue"]="Tuesday" ;for (i in weekdays )print weekdays[i]}'   
                        # netstat -tan | awk '/^tcp>/  {state[$NF]++} END { for (i in state) {print i, state[i]}}' 
    
                        #cat /etc/fstab | awk '/^/dev/   {fstype[$3]++} END {for (i in fstype) print i ,fstype[i]}'
                        # awk '{for(i=1;i<=NF;i++) {count[$i]++} } END {for (i in count) print i,count[i]}' /etc/services 
        9、函数
                9.1 内置函数
                        数值处理:
                        rand():返回0和1之间的一个小数
                        字符串处理
                        length([s]):返回指定字符串长度;
                        sub(r,s,[t]):以r表示的模式来查找t所表示的字符串中的匹配的内容,将将其第一次出现替换为s的内容
                        gsub(r,s[t]):全部替换
                        split(s,a[,r]):以r为分隔符切割字符s,并将切割后的结果保存到a所表示的数组中;
                        netstat -tan | awk '/^tcp>/ {split($5,ip,":");  count[ip[1]]++} END {for (i in count) {print i,count[i]}}'
                9.2 自定义函数
  • 相关阅读:
    通过Powershell开启RDP
    映射网络驱动器
    简易图书管理系统
    使用IDEA快速创建Spring Boot项目
    oracle11g安装步骤详细图文教程
    使用JDOM创建XML文档
    使用JDOM解析XML文档
    HTML+CSS之金立官网部分实现
    webstorm2019安装与使用详细教程
    第二章 JavaScript基础指令
  • 原文地址:https://www.cnblogs.com/feng-land/p/9975788.html
Copyright © 2020-2023  润新知