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 自定义函数
原文地址:https://www.cnblogs.com/feng-land/p/9975788.html