awk的基本用法(代码片段)

author author     2022-11-17     577

关键词:

awk:

文本处理三剑客:grep系,sed,awk
 1. grep系:基于PATTERN进行文本过滤
  grep:支持基本的正则表达式
 egrep:支持基本的和扩展的正则表达式
 fgrep:不支持正则表达式,纯文本

  2.sed:流编辑器,逐行编辑器;
模式空间
保持空间

 3. awk:报告生成器;格式化文档输出;
也是一种编程语言(有变量...)

gawk:模式扫描和处理语言;
 格式:gawk [ options ] ‘program‘ file...
  program:[/PATTERN/]ACTION statement;...  若PATTERN省去 则表示任何     行都可以;
  PATTERN部分:决定动作语句何时触发以及通过什么事件来触发;   动作语句就是里面的内容;
  BEGIN,END
  动作语句:对数据进行特定的处理,通常放置在中
        ACTION statement:对数据进行特定的处理,通常放置在中;
                    print, printf
基本概念:
        分隔符:
                输入分隔符:
                    awk对数据进行处理时,会根据特定的标识符号对数据进行分段处理,这种标识符号就称为"输入分隔符",默认的输入分隔符是空白字符;如果指定的分隔符并没有被数据包括,则只有换行分隔符有效;
    输出分隔符:
                        awk对数据处理完成后,会以特定的标识符号对各个字段进行连接后输出,这种标识符号就称为"输出分隔符",默认的输出分隔符是空白字符;
        记录:由换行符进行分隔的数据中一行,就称为一条记录(Record);通常在使用awk处理数据时,使用内置变量$0来保存整个记录的内容;
                字段:经过分隔符分隔之后的每一个数据分段,都成为一个字段(Field);通常在使用awk处理数据时,使用$1,$2...$NF等内置变量来存储各个字段的数据;
    awk的工作原理:
        1.首先,执行BEGINACTION statement;...语句块中的语句;
        2.其次,从文件中或着标准输入读取一行,根据PATTERN的匹配结果执行后面的ACTION语句块中的内容;然后逐行重复该过程已完成数据处理,直到数据全部被读取完毕;
        3.最后,在所有的语句块都执行完成之后,退出awk进程之前,执行ENDACTION statement;...语句块中的语句;

        注意:
            1) BEGIN语句块在awk开始处理数据内容之前就被执行;通常用于生成表头;此语句块是可选语句块;
            2) END语句块在处理完所有的数据之后,才会被执行;通常用于数据汇总;此语句块是可选语句块;
            3) PATTERN语句块中的通用命令是最重要的部分,因此PATTERN语句块不能省略,但其中的ACTION可以省略,如果省略,则默认执行print动作,即:显示数据的各行;
            4) awk在执行PATTERN语句块时,默认循环遍历数据中的各个记录;

    常用选项:
        -f,--file program-file:从指定的文件中加载program语句块,而不是通过命令行给出相关的程序内容;
        -F,--field-separator fs:指定字段的输入分隔符;默认是空白字符;
        -v,--assign var=val:用于声明自定义变量并为变量赋值;

    awk的常用用法:
        1.变量:
            内建变量:
                FS:input field separator,输入字段分隔符,默认为空白字符;
                OFS:output field separator,输出字段分隔符,默认为空白字符;
                    示例:
                        ~]# awk -v FS=‘:‘ -v OFS=‘:‘ ‘print $1,$3,$7‘ /etc/passwd

                RS:The input record separator,输入记录(行)分隔符,默认为换行符;
                    注意:即使指定了额外的输入记录分隔符,原有的换行符依然有效;
                ORS:The output record separator,输出记录分隔符,默认为换行符;
                    示例:
                        ~]# awk -v RS=‘:‘ -v ORS=‘#‘ ‘print $0‘ /etc/passwd

                NF:The number of fields,每一行中的字段的总数;
                    示例:
                        ~]# awk -F: ‘print NF‘ /etc/passwd
                            显示指定文件中每行中的字段的数量;
                        ~]# awk -F: ‘print $NF‘ /etc/passwd
                            显示指定文件中每行中最后一个字段的内容;
                        ~]# awk -F: ‘print $(NF-1)‘ /etc/passwd
                            显示指定文件中每行中倒数第二个字段的内容;

                NR:The total number of input records,行的总数;如果仅处理一个文件,可以将NR的值当作此文件中各行的行号;
                    示例:
                        ~]# awk ‘print NR‘ /etc/fstab

                FNR:The input record number in the current input file,对于不同的文件分别统计其行的数量;即使处理多个文件,也可以显示每个文件中每行的行号;
                    示例:
                        ~]# awk ‘print FNR‘ /etc/fstab /etc/issue

                FILENAME:The  name  of  the current input file,当前正在被处理的文件的文件名;
                    示例:
                        ~]# awk ‘ENDprint FILENAME‘ /etc/fstab

                ARGC:The number of command line arguments,命令行中参数的数量;包括awk命令本身,但不包括awk命令的选项部分和program部分;
                    示例:
                        ~]# awk ‘ENDprint ARGC‘ /etc/fstab /etc/issue /etc/passwd

                ARGV:Array of command line arguments,由命令行中所有的参数构成的数组;
                    示例:
                        ~]# awk ‘ENDprint ARGV[1]‘ /etc/fstab /etc/issue /etc/passwd
                            显示命令行中的第N个参数;

            自定义变量:
                定义方式:
                    -v var_name=value

                    注意:变量名字母大小写敏感的;

                    示例:
                        ~]# awk -v var=‘hello‘ -F: ‘print $1"," var‘ /etc/passwd

        常用的ACTION:
            2.print:Print the current record,以标准格式输出结果;
                格式:
                    print item1,item2,...

                    注意:
                        1) 各item之间需要使用","进行分隔;
                        2) 输出的各item可以是字符串,可以是数字,可以是当前记录中的字段,可以是变量,可以是awk的表达式;
                        3) 如果省略了item,则默认的item为$0,即:输出整行;

                    示例:
                        ~]# awk ‘print‘ /etc/issue
                        ~]# awk ‘print $1,$3,$NF‘ /etc/issue

            3.printf:Format and print,以特定的格式输出结果;
                格式:
                    printf "FORMAT" item1,item2,...

                    注意:
                        1) 必须给出合适的输出格式;
                        2) 默认不会自动换行,如果想要在输出结果中换行显示,需要显式给出换行控制符号,即:\n;
                        3) FORMAT中需要为后面的每一个item单独指定一个格式化符号;

                    常用的FORMAT:
                        %c:以ASCII码表中的内容显示字符信息;
                        %d, %i:显示十进制整数;
                        %e, %E:以科学计数法来显示数字;浮点类型;
                        %f, %F:显示十进制数字的浮点形式;
                        %g, %G:以科学计数法显示浮点数字;
                        %u:显示无符号十进制数;
                        %s:显示字符串;
                        %x, %X:显示无符号的十六进制整数;
                        %%:显示%;

                    修饰符:
                        #[.#]:第一个数字用来控制显示宽度;第二个数字表示小数点的精度;
                            如:%5s, $8.3f

                        -:表示采用左对齐方式显示;默认是右对齐;
                        +:显示数字的正负符号;

                        示例:
                            ~]# awk -F: ‘printf "%20s:%-+5d\n",$1,$3‘ /etc/passwd

            4.操作符:
                算术运算操作符:
                    双目运算符:
                        x+y, x-y, x*y, x/y, x^y, x%y
                    单目运算符:
                        -x:将正整数转换为负整数;
                        +x:将字符串转换为数值;

                    示例:
                        ~]# awk -F : ‘ENDprint 100^2‘ /etc/passwd

                字符串操作符:
                    无任何操作符号时,即为字符串连接操作;

                赋值操作符:
                    =, +=, -=, *= ,   ^=, %=, 
                    ++, --

                比较操作符:
                    ==, !=, >, >=, <, <=

                    示例:
                        ~]# awk -F : ‘$3==1000print $0‘ /etc/passwd

                模式匹配操作符:
                    ~:操作符左侧的字符串是否能够被右侧的PATTERN所匹配;
                    !~:操作符左侧的字符串是否不能被右侧的PATTERN所匹配;

                    示例:
                        ~]# awk -F : ‘$NF~/bash/print $0‘ /etc/passwd

                逻辑运算操作符:
                    &&
                    ||
                    !
                    示例:
                        ~]# awk -F: ‘$3>=1000&&$3<=1100print $0‘ /etc/passwd

                条件表达式:
                    selector(condition)?if-true-expression:if-false-expression

                    示例:
                        ~]# awk -F: ‘$3>=1000?usertype="Common User":usertype="SuperUser or Sysuser";printf "%20s: %-20s\n",$1,usertype‘ /etc/passwd

            5.PATTERN部分:
                1) empty:空模式,不加区分地处理文件的每一行;
                2) [!]/REGEXP/:仅处理[不]能被PATTERN匹配到的行;
                    示例:
                        ~]# awk -F: ‘/^r/print $0‘ /etc/passwd
                        ~]# awk -F: ‘!/n$/print $0‘ /etc/passwd
                3) 关系表达式:
                    $3>=1000
                    $NF~/bash/
                4) 行域,行范围:
                    关系表达式的逻辑运算:FNR>=10&&FNR<==20
                    示例:
                        ~]# awk ‘NR>=15&&NR<=20print NR,$0‘ /etc/passwd

                    /REGEXP1/,/REGEXP2/:
                        从被REGEXP1匹配的行开始,直到被REGEXP2匹配的行结束,这期间的所有行;凡是属于此类的匹配结果,有多少组就显示多少组;
                    示例:
                        ~]# awk -F: ‘/^r/,/^a/print NR,$0‘ /etc/passwd
                5) BEGIN/END模式:
                    BEGIN
                        仅在开始处理文件中的第一行文本数据之前执行一次的语句块;多用于输出特定格式的表头信息;
                        示例:
                            ~]# awk -F: ‘BEGINprintf "%20s %10s %20s\n","USERNAME","USERID","SHELL"NR>=15&&NR<=20printf "%20s %10s %20s\n",$1,$3,$7‘ /etc/passwd

                    END
                        仅在文本处理完成但awk命令尚未退出时执行一次的语句块;多用于数据信息的汇总;
                            示例:
                                ~]# awk -F: ‘BEGINprintf "%20s %10s %20s\n","USERNAME","USERID","SHELL"NR>=15&&NR<=20printf "%20s %10s %20s\n",$1,$3,$7ENDprint "------------------------------------------------------------------\n",NR " users"‘ /etc/passwd

                    注意:
                        1) BEGIN语句块,PATTERN语句块和END语句块的顺序,通常来讲是:
                            BEGINPATTERNEND
                        2) BEGIN语句块和END语句块是可选的,但PATTERN语句块必须要给出;

            6.常用的ACTIONS
                1) 表达式(Expression)
                2) 组合语句(Compound Statements)
                3) 输入语句(Input Statements)
                4) 输出语句(Output Statements)
                5) 控制语句(Control Statements)

            7.控制语句:
                if (condition) statement [ else statement ]
                while (condition) statement
                do statement while (condition)
                for (expr1; expr2; expr3) statement
                for (var in array) statement
                break
                continue
                exit [ expression ]
                switch (expression)  case value|regex : statement ... [ default: statement ] 
                next

                1) if ... else:
                    语法:
                        if (condition) statement [ else statement ]
                        使用场景:对awk取得的整行或某个字段做条件判断;

                        示例:
                            ~]# awk -F: ‘if($3>=1000)print "CommonUser:",$1elseprint "Sysuser:",$1‘ /etc/passwd
                            ~]# awk ‘/^[^#]/if(NF==6)print‘ /etc/fstab

                        分析磁盘上各个文件系统的空间利用率:
                            ~]# df -h | awk -F% ‘/^\/dev/print $1‘ | awk ‘if($NF>=80)print $1‘

                2) while循环:
                    语法:
                        while (condition) statement
                        使用场景:
                            a.对一行内的多个字段逐一做相同或类似的操作处理时使用;
                            b.对数组中的各数组元素做遍历处理时使用;

                        while循环的特点:条件为真,进入循环;一旦条件为假,则退出循环;

                        示例:
                            ~]# awk ‘i=1;while(i<=NF)print $i,length($i);i++‘ testfile

                3) do ... while语句:
                    语法:
                        do statement while (condition)

                        意义:与while循环相同,但statement语句段至少被执行一次;

                4) for循环:
                    语法:
                        for (expr1; expr2; expr3) statement
                            expr1:variable assignment,变量赋初值;
                            expr2:circle condition,循环条件判断;
                            expr3:interation process,变量值修正方法;

                            示例:
                                ~]# awk ‘for(i=1;i<=NF;i++)print $i,length($i)‘ testfile

                        for (var in array) statement

                5) switch ... case语句
                    语法:
                        switch (expression)  case value|regex:statement;case value2|regex2:statement;... [ default: statement ] 

                        使用场景:
                            用于进行字符串比较判断;

                6) break和continue语句:
                    break [n]
                    continue

                    注意:其使用场景是行内多个字段间做循环时的循环控制方式;
                    示例:
                        ~]# awk ‘for(i=1;i<=NF;i++)if(length($i)<5)continueelseprint $i,length($i)‘ testfile

                7) next语句:
                    在awk处理数据时,提前结束对当前行的处理,而直接开始处理下一行;

                    示例:
                        ~]# awk -F: ‘if($3%2==1)nextelseprint $1,$3‘ /etc/passwd
                        ~]# awk -F: ‘if($3%2==1)next;print $1,$3‘ /etc/passwd

            8.数组——Array
                用户自定义的数组,一般使用关联数组:array_name[index_expression]
                    注意:
                        1) index_expression可以使用任意的字符串,但字符串必须放在双引号中;
                        2) 支持弱变量数组,即:如果某数组元素事先不存在,当引用该元素时,awk会自动创建此元素,并为此元素赋"空字符串"作为其初始值;

                    示例:
                        ~]# awk ‘BEGINname["leader"]="zhangsan";name["mem1"]="lisi";name["mem2"]="bob";print "Leader:",name["leader"],"Member:",name["mem1"],name["mem2"]‘

                        ~]# awk ‘BEGINname["leader"]="zhangsan";name["mem1"]="lisi";name["mem2"]="bob";for(i in name)print name[i]‘

                        查看当前系统上所有服务的不同TCP状态的连接数量的统计:
                            ~]# netstat -nalt | awk ‘/^tcp\>/state[$NF]++ENDfor(stat in state)printf "%15s: %-10d\n",stat,state[stat]‘

                        用于统计本服务器web站点的每个用户的请求数值:
                            ~]# awk ‘ipaddr[$1]++ENDfor(ip in ipaddr)print ip,ipaddr[ip]‘ /var/log/httpd/access_log

                        用于统计本服务器web站点的UV值:
                            ~]# awk ‘ipaddr[$1]++ENDfor(ip in ipaddr)print ip,ipaddr[ip]‘ /var/log/httpd/access_log | wc -l

            9.函数:
                内建函数:
                    数值函数:Numeric Functions
                        rand():返回一个介于0到1之间的随机数;
                        sqrt():对于指定的数值进行开二次方;

                    字符串函数:String Functions
                        length():计算给定字符串的长度;
                        gsub(r, s [, t]):以r表示的模式来查找t表示的字符串中能够被匹配的内容,并将所有出现的内容替换成s表示的内容;
                        split(s, a [, r [, seps] ]):以seps作为分隔符,利用r表示的模式进行匹配,将s代表的字符串分割之后,保存在a表示的数组中;

                自定义函数:
                    function name(parameter list)  statements 

awk的基本用法(代码片段)

最近遇到导入的csv文件首行为日期,但需要将日期作为列导入到数据库中,直接使用ctl文件好像无法实现,了解到awk这个强大的命令。导入的CSV文件除了首行为日期,其他的都是格式相同的。需要将首行单独读取出来,获取日期... 查看详情

awk的简单用法(代码片段)

目录1.awk的基本格式2.awk中的变量3.操作符一.awd的基本格式awk[options]‘program‘file…program:patternactionstatements;..pattern和action:?pattern部分决定动作语句何时触发及触发事件BEGIN,END?actionstatements对数据进行处理,放在内指明print,printf分... 查看详情

awk用法详解(代码片段)

awk本章内容awk介绍awk基本用法awk变量awk格式化awk操作符awk条件判断awk循环awk数组awk函数调用系统命令AWK介绍awk:Aho,Weinberger,Kernighan,报告生成器,格式化文本输出有多种版本:Newawk(nawk),GNUawk(gawk)gawk:模式扫描和处理语言... 查看详情

awk的基本用法(代码片段)

...的字段、变量或awk的表达式;如省略item,相当于print$0.awk基本用法:-F:指明输?时?到的字段分隔符;-vvar=value:?定义变量。eg:awk-F:‘print$1‘/etc/passde指定:未分隔符,打印每行记录的第一个字段即输出$1awk的变量用法内置变量:... 查看详情

awk常用用法(代码片段)

 一.基本使用方法:awk‘pattern+action‘filenames#其中pattern表示AWK在数据中查找的内容,而action是在找到匹配内容时所执行的一系列命令通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处... 查看详情

awk指令用法详解(代码片段)

1.awk概述1.1awk命名历史awk有3个不同版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是AWK的GNU版本。awk其名称得自于它的创始人AlfredAho、PeterWeinberger和BrianKernighan姓氏的首个字母。实际上AWK的确拥有自己的语言:... 查看详情

awk的介绍学习(代码片段)

第一节、awk的工作流程和基本用法1.awk介绍awk是一种报表生成器,就是对文件进行格式化处理的,这里的格式化不是文件系统的格式化,而是对文件内容进行各种“排版”,进而格式化显示。在linux之上我们使用的是GNUawk简称gawk... 查看详情

linux下的awk用法详解(代码片段)

(Linux下的awk用法详解)一、awk介绍1.AWK是一种处理文本文件的语言,是一个强大的文本分析工具。之所以叫AWK是因为其取了三位创始人AlfredAho,PeterWeinberger,和BrianKernighan的FamilyName的首字符。2.AWK拥有自己的语言:AWK程序设计语言,... 查看详情

十五awk文本处理(代码片段)

...获得指定的数据单独用时,可对文本数据做统计  基本用法  语法格式  前置命令|awk[选项]‘[条件]编辑指令‘awk[选项 查看详情

linuxbash文本处理命令awk,sed,grep用法(代码片段)

Linuxbash文本处理命令grep,sed,awk用法grep,sed,awk的主要用途及区别:grep用法grep-rn"hello,world!"././:表示路径为当前目录.-r是递归查找-n是显示行号如果加上-i,则为忽略大小写。sed用法awk用法 查看详情

awk编程的基本用法

awk也是用来处理文本的,awk语言可以从文件或字符串中基于指定规则浏览和抽取信息,可以实现数据查找、抽取文件中的数据、创建管道流命令等功能。awk模式匹配第一种方法打印空白行将空白行打印出来,并输出thisisablankline.... 查看详情

文本处理工具awk简单用法案例(代码片段)

AWK文本处理输出格式化的文本报表执行算数运算执行字符串操作常用参数:-F 指定输入时用到的字段分隔符指明输入时用到的字段分隔符,默认的分隔符是若干个连续空白符-v 自定义变量-f 从脚本中读取awk命令-m 对val值... 查看详情

awk命令基本使用方法(代码片段)

awk命令基本用法awk‘print$1,$4‘netstat.txt单引号中大括号的部分就是awk语句$1至$n表示第几列,$0表示整行格式化输出的方法$awk‘printf"%-8s%-8s%-8s%-18s%-22s%-15s",$1,$2,$3,$4,$5,$6‘netstat.txt过滤记录$awk‘$3==0&&$6=="LISTEN"‘netstat.txt第3列... 查看详情

awk介绍和基本用法

AWK介绍:       awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切... 查看详情

awk在删除镜像过程中的用法及说明(代码片段)

引自:https://segmentfault.com/a/1190000005821733用途:可以同时删除同一个镜像下所有的容器 看到一篇“Docker技巧:删除Docker容器和镜像”其中提到删除标签为none的镜像的方法,其中用到了awk,就去查了下,下面举例说明:dockerrmi$... 查看详情

awk基础语法与简单示例(代码片段)

awk介绍??awk:Aho,Weinberger,Kernighan,报告生成器,格式化文本输出??有多种版本:????Newawk(nawk),GNUawk(gawk)????gawk:模式扫描和处理语言??基本用法:????awk[options]‘program’var=valuefile…????awk[options]-fprogramfilevar=valuefile…????awk 查看详情

gawk初识(代码片段)

...本:Newawk(nawk),GNUawk(gawk)gawk:模式扫描和处理语言基本用法:awk[options]‘program‘var=valuefile…awk[options]-fprogramfilevar=valuefile…awk[options]‘BEGINaction;… 查看详情

awk用法记录(代码片段)

awk简介awk是一种编程语言,主要用于在linux/unix下对文本和数据进行处理,是linux/unix下的一个工具。数据可以来自标准输入、一个或多个文件,或其它命令的输出。awk的处理文本和数据的方式:逐行扫描文件,默认从第一行到最... 查看详情