linux的awk命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux的awk命令相关的知识,希望对你有一定的参考价值。

awk 是继 grep系 和 sed系 的第三个文本处理器


gawk - pattern scanning and processing language

    格式:

gawk [ options ] 'program' file ...

program:/PATTERN/{ACTION statement; ...}

PATTERN部分:决定动作语句何时触发以及通过什么事件来触发;

BEGIN,END


ACTION statement:对数据进行特定的处理,通常放置在{}中,并使用单引号进行引用;

print,printf

对awk来说,是需要有分隔符这个概念的,因为awk是根据分隔符来区分所需要操作的字段的;


    输入分隔符:

        awk对数据进行处理时,会根据特定的标识符号对数据进行分段处理,这种标识就称为“输入分隔符”,默认输入分隔符为空格;

    输出分隔符:

        awk在对数据处理完毕之后,会以特定的标识符号对各个字段进行连续后输出。这种标识就称为“输出分隔符”,默认输出分隔符是空白字符;


    记录:

        由换行符进行分隔的数据中的一行,称为一条记录;通常用$0来保存整个记录的内容;

    

    字段:

        经过分隔符分隔之后的每一个数据分段,都称为一个字段(field);通常在使用awk处理数据时,使用$1, $2, ..$NF等内置变量来存储各个字段的数据;


awk的最全的工作模式: BEGIN{ACTION statement}{ACTION statement}END{ACTION statement}

    首先执行BEGIN语句块,其次是主语句块,最后是END语句块;特别提示:BEGIN语句块执行的时候,不会处理数据内容,是在处理数据之前执行的语句,一般用于表头的书写;相反的END语句块,是执行玩数据处理之后,才会执行的语句,一般用于输出总数;BEGIN和END语句块都有可以省略不写,但是中间的语句块必须要写,不能省略;


常用选项:

    -f program-file:从指定的文件中加载program语句块,而不是通过命令行给出相关的程序内容;

    -F fs:指定出入字段的输入分隔符;默认是空白字符;

    -v  var=val:用于声明自定义变量并为变量赋值;


awk的常用用法:

    1.变量:

        内建变量:    

            FS:input field separator,输入字段分隔符,默认为空白字符;

    OFS:output field separator,输出字段分隔符,默认为空白字符;

技术分享图片

            RS: input record separator,输入记录(行)分隔符,默认为换行符;

注意:如果指定了额外的输入记录分隔符,原有的换行符依然有效;

            ORS:output record separator,输出记录分隔符;默认为换行符;

技术分享图片

            NF:number of fields,每一行中字段的总数;

技术分享图片

技术分享图片

技术分享图片

            NR:total number of input records,行的总数;如果仅处理一个文件,可以将NR的值当做此文件的各行的行号;

技术分享图片

            FNR: The input record number in the current input file,对于不同的文件分别统计其行的数量,也可以显示每个文件中每行的行号;

技术分享图片

            FILENAME:The name of the current input file,当前正在被处理的文件的文件名;

技术分享图片

            ARGC:The number of command line arguments,自定义变量命令行中参数的数量,包括awk命令本身,但不包括awk命令的选项部分和program部分;

技术分享图片

            ARGV:Array of command line arguments.由命令行中所有的参数所构成的数组;

 技术分享图片

        自定义变量:

            -v var_name=value(变量名大小写敏感)

技术分享图片


    常用的ACTION:

        2.print:Print the current record,以标准格式输出结果;

            格式:

                print  item1,item2,...

                注意:

    1) 各item之间需要使用","进行分隔;

    2) 输出的各item可以是字符串,可以是数字,可以是当前记录中的字段,可以是变量,可以是awk的表达式;

    3) 如果省略了item,则默认的item为$0,即:输出整行

技术分享图片

技术分享图片

        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

                    -:表示采用左对齐方式显示;默认是右对齐;

                    +:显示数字的正负符号;

技术分享图片

            4.操作符:

                算术运算操作符:

                    双目运算符:

                        x+y,x-y,x*y,x/y,x^y, x%y

                    单目运算符:

                        -x: 将正整数转换为负整数;

                        +x:将字符串转换为数值;

                  字符串操作符:

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

                   赋值操作符:

        =,+=,-=,*=,/=,^=,%=

++, --

    比较操作符

        ==,!=,<, <=, >, >=

技术分享图片

                        模式匹配操作符:

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

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

技术分享图片

                        逻辑运算操作符:

                           &&     ||      ! 

 技术分享图片

                            条件表达式:

selector(condition)?if-true-expression:if-false-expression

技术分享图片

            5.PATTERN部分:

1) empty:空模式,不加区分地处理文件的每一行;

2) [!]/REGEXP/:仅处理[不]能被PATTERN匹配到的行;

技术分享图片

                3) 关系表达式:

$3>=1000

$NF~/bash/

4) 行域,行范围:

关系表达式的逻辑运算:FNR>=10&&FNR<==20

/REGEXP1/,/REGEXP2/:

从被REGEXP1匹配的行开始,直到被REGEXP2匹配的行结束,这期间的所有行;凡是属于此类的匹配结果,有多少组就显示多少组;

技术分享图片

    5) BEGIN/END模式:

BEGIN{}

    仅在开始处理文件中的第一行文本数据之前执行一次的语句块;多用于输出特定格式的表头信息;

END{}

    仅在文本处理完成但awk命令尚未退出时执行一次的语句块;多用于数据信息的汇总;



注意:

1) BEGIN语句块,PATTERN语句块和END语句块的顺序,通常来讲是:

BEGIN{}PATTERN{}END{}

2) BEGIN语句块和END语句块是可选的,但PATTERN语句块必须要给出;

技术分享图片

              6.控制语句:

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取得的整行或某个字段做条件判断;

技术分享图片

分析磁盘上各个文件系统的空间利用率:

技术分享图片

2) while循环:

语法:

while (condition) statement

使用场景:

a.对一行内的多个字段逐一做相同或类似的操作处理时使用;

b.对数组中的各数组元素做遍历处理时使用;


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


技术分享图片

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,变量值修正方法;

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


    注意:其使用场景是行内多个字段间做循环时的循环控制方式;

技术分享图片


        7) next语句:

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

技术分享图片

7.数组——Array

用户自定义的数组,一般使用关联数组:array_name[index_expression]

注意:

1) index_expression可以使用任意的字符串,但字符串必须放在双引号中;

2) 支持弱变量数组,即:如果某数组元素事先不存在,当引用该元素时,awk会自动创建此元素,并为此元素赋"空字符串"作为其初始值

技术分享图片            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 }





以上是关于linux的awk命令的主要内容,如果未能解决你的问题,请参考以下文章

linux awk命令详解

linux awk命令怎么用?

如何在Linux中使用awk命令

linux awk命令怎么用?

awk 命令

Linux awk -F 命令如何指定输出双引号里的内容,求助