zoukankan      html  css  js  c++  java
  • linux基础之awk

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

        选项: 
            -F: 指明输入时用到的字段分隔符
                    # awk -F: 'print $1' /etc/passwd 指明输入时的分隔符为冒号,打印第一个字段
            -v var=value: 自定义变量
                    # awk -v FS=':' '{print $1}' /etc/passwd 使用内建变量FS指明输入时的分隔符为冒号,打印第一个字段
    1. print
           print item1, item2, ...
            要点:
                1. 逗号分隔符
                2. 输出的各item可以是字符串,也可是数值;当前记录的字段、变量或者awk的表达式
                3. 如果省略item,相当于print $0
    
    2. 变量
        2.1 内建变量
            FS: input field seperator,输入时的分隔符,默认为空白字符
                    # awk -v FS=':' '{print $1}' /etc/passwd
            OFS:output field seperator,输出时的分隔符,默认为空白字符
                    # awk -v OFS=':' '{print $1,$2,$3,$7}' /etc/passwd
            RS: input record seperator,输入时的换行符
                    # awk -v RS=' ' '{print}' /etc/passwd
            ORS: output record seperator,输出时的换行符
                    # awk -v ORS='#' '{print}' /etc/passwd
            NF: number of field,字段数量
                    # awk '{print NF}' /etc/fstab   显示每行多少段
                    # awk '{print $NF}' /etc/fstab 显示最后一段的值
            NR: number of record,行数
                    # awk '{print NR}' /etc/fstab 显示每行行数
            FNR: 各文件分别计数:行数
                    # awk '{print FNR}' /etc/fstab /etc/passwd
            FILENAME:当前文件名
                    # awk '{print FILENAME}' /etc/fstab
            ARGC:命令行参数的个数
                    # awk 'BEGIN{print ARGC}' /etc/passwd /etc/passwd
            ARGV: 数组,保存的是命令行所给定的各参数
                    # awk 'BEGIN{print ARGV[0]}' /etc/passwd /etc/fstab 显示的参数为awk
    
        2.2 自定义变量
            1. -v var=value
                    # awk -v test='hello gawk' '{print test}' 打印自定义变量test的值
    
            2. 在program中直接定义
                    # awk 'BEGIN{test="hello gawk";print test}' 
    
    3. printf命令
        格式化输出: printf FORMAT,item1,item2,...
                格式符:
                    %c: 显示字符的ASCII码
                    %d,%i: 显示十进制整数
                    %e,%E: 科学计数法数值显示
                    %f: 显示为浮点数
                    %g,%G: 以科学计数法或浮点形式显示数值
                    %s: 显示字符串
                            # awk '{print "%s
    ",$1}' /etc/fstab
                            # awk '{print "alen:%s
    ",$1}' /etc/fstab
                    %u: 无符号整数
                    %%: 显示%自身 
                  修饰符
                        #[.#]: 第一个数字控制显示的宽度,第二个#表示小数点后的精度,比如%3.1f
                        默认右对齐
                        -:左对齐
                                # awk -v FS=':' '{printf "Usernme:%-15s,UID:%d
    ",$1,$3}' /etc/passwd
                        +: 显示数值的符号
    
    4. 操作符
                算术操作符
                    x+y, x-y, x*y, x/y, x^y, x%y
                赋值操作符:
    		    =,+=,*=,/=,%=,^=
    		    ++,--
    	        比较操作符:
    		    >,>=,<,<=,!=,==
    	        模式匹配符:
    		    ~:是否匹配
    		    !~:是否不匹配
    	        逻辑操作符:
    		    &&
    		    ||
    		    !
            	函数调用
    		    function_name(argu1,argu2,...)
    	        条件表达式:
    		    selector?if-true-expression:if-false-expression
                    示例: id号小于500为系统用户或者管理员,大于500为普通用户
                        # awk -v FS=':' '{$3<500?usertype="SysAdmin or SysUser" : usertype="common user";printf "%-15s,%-s
    ",$1,usertype}' /etc/passwd
    
    5.PATTERN
        1. empty: 空模式,匹配每一行
    
        2. /regular expression/: 仅处理能够被此处的模式匹配到的行
    
            # awk '/^UUID/{print $1}' /etc/fstab
    	    # awk '!/^UUID/{print $1}' /etc/fstab
    	    # awk -F: '$NF~/bash$/{print $1,$NF}' /etc/passwd
    
        3. relational expression: 关系表达式,结果有真有假;结果为真才会被处理:
    									真:结果为非0值,非空字符串
    
        4. line renges:行范围
    		startline,endline: /pat1/,/pat2/
    		注意: 不支持直接给出数字的格式
    		    # awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
    
        5. BEGIN/END模式
    		BEGIN{}: 仅在开始处理文件中的文本之前执行一次
    		END{}: 仅在文本处理完成之后执行一次
    		    # awk -F: 'BEGIN{print " username   uid
    -----------------------------"}{printf "%-15s,%-10d
    ",$1,$3}END{print "---------------------end---------------"}' /etc/passwd
    
         6.常用的action
    		1. EXPRESSIONS
    		2. Control statements: if, while等
    		3. Compound statements:组合语句
    		4. input statements
    		5. output statements
    
    	7. 控制语句
    		if(confition) {statments}
    		if(condition) {statments} else {statements}
    		while(condition) {statements}
    		do {statements} while(condition)
    		break
    		continue
    		delete array[index]
    		delete array
    		exit
    		{ statements }
    
            7.1 if-else
    		语法: if(condition) statement [else statement]
    		# awk -F: '{if($3>=500){printf "%s,%d
    ",$1,$3} else {printf "SysadminUser:Username:%s,Uid:%d
    ",$1,$3}}' /etc/passwd
    		# awk -F: '{if($NF=="/bin/bash"){print $0}}' /etc/passwd
    		# awk '{if(NF>5) print $0}' /etc/fstab
    		# df -h | awk -F% '/^/dev/{print $1}' | awk '{if($NF>20)print $1}' 
    		使用场景: 对awk取得的整行或某个字段做条件判断;     
    
            7.2 while循环
    		语法: while(condition) statement
    			条件“真”,进入循环;条件“假”,退出循环
    			# awk '/^[[:space:]]*/{i=1;while(i<=NF) {print $i,length($i);i++}}' /etc/grub2.cfg
    			# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7){print $i,length($i)}; i++}}' /etc/grub2.cfg
    		使用场景: 对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用 
    
            7.4 for循环
    		语法: for(expr1;expr2;expr3) statement
    			for(variable assignment;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/: statement; case VALUE2 or /REGEXP/: 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"
    		若要遍历数组中的每个元素,要使用for循环
    			for(var in array) {for-body}
    			    # awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays){print weekdays[i]}}'
    			注意: var会遍历array的每个索引
    			state["LISTEN"]++
    			state["ESTABLISHED"]++
    			    # netstat -atn | awk '/^tcp/{state[$6]++}END{for(i in state){print i,state[i]}}'
    			    # awk '{ip[$1]++}END{for(i in ip){print i,ip[i]}}' /var/log/httpd/access_log
    
            练习1: 统计/etc/fstab文件中每个文件系统类型出现的次数
    			# awk '/^(/dev|UUID)/{fstype[$3]++}END{for(i in fstype){print i,fstype[i]}}' /etc/fstab
    
    	    练习2:统计指定文件中每个单词出现的次数
    		    # awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count){print i,count[i]}}' /etc/fstab    
       9. 函数
             9.1 内置函数
     		数值处理:
     			rand(): 返回0和1之间一个随机数
     			# awk 'BEGIN{print rand()}'
    
     		字符串处理:
     			length([s]): 返回指定字符串的长度
     			sub(r,s,[t]): 以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容
     			gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现替换为s所表示的内容
     			split(s,a[],r):以r为分隔符切割字符串s,并将切割后的结果保存至a所表示的数组中,
                           注意: awk中的属组是从1开始编号
     			    # netstat -atn | awk '/^tcp>/{split($5,ip,":");count[ip[1]]++}END{for(i in count){print i,count[i]}}'
  • 相关阅读:
    win10家庭版添加远程桌面服务功能
    GNS3测试NAT元件功能
    prometheus监控系统之snmp-exporter部署来监控交换机端口流量
    GNS3内网配置虚拟机测试
    GNS3内网通过cloud与实际网络实现互连互通的实验(使用环回网口)
    添加对docker的监控
    docker环境下的Grafana安装
    prometheus配置pushgateway功能测试
    京东html面单
    顺丰html面单
  • 原文地址:https://www.cnblogs.com/ckh2014/p/10760632.html
Copyright © 2011-2022 走看看