一、awk语法格式

awk是文本处理工具,通常用于处理数据并生成结果报告。

(1)awk 'BEGIN{}pattern{commands}END{}' file_name  :BEDING大括号后面的在处理文件之前处理,END在处理之后处理

(2)standard out | awk 'BEGIN{}pattern{commands}END{}' :对标准输出通过管道形式进行awk处理

二、awk内置变量

$0:整行内容

$1-$n:当前的第1-n个字段

NF:当前行的字段个数,也就是有多少列 【Number Field

NR:当前的行号,从1开始计数 【Number Row

FNR:多文件处理时,每个文件行号单独计数,从1开始 【File Number Row

FS:输入字段分隔符,不指定默认以空格或tab键分割,【Field Separator】指定时要用双引号如FS=":"

RS:输入行分隔符。默认回车换行 【Row Separator

OFS:输出字段分隔符。默认为空格 【Output Field Separator】

ORS:输出行分隔符。默认回车换行 【Output Row Separator】

FILENAME:当前输入的文件名称 

ARGC:命令行参数个数

ARGV:命令行参数数组

下面为例子:--------------------------------------------

{print $0}为全部输出。BEGIN{FS=":"}在输出前先以冒号把内容分隔,$7为打印第7列的内容

【Shell脚本】awk命令_第1张图片

注:在awk当中引用内置变量的时候不需要加$

【Shell脚本】awk命令_第2张图片

行分隔符,RS默认以回车分隔,可以指定如冒号

【Shell脚本】awk命令_第3张图片

修改不以空格为输出分隔符,用-----

【Shell脚本】awk命令_第4张图片

NF是列数,$NF就是相当于最后一列

【Shell脚本】awk命令_第5张图片


三、格式化输出之printf

%s:打印字符串

%d:打印十进制数

%f:打印一个浮点数

%x:打印十六进制数

%o:打印八进制数

%e:打印数字的科学计数法形式

%c:打印单个字符的ASCII码

-:左对齐

+:右对齐

#:显示8进制在前面加0,显示16进制在前面加0x

下面为例子:--------------------------------------------

%s字符串,可以定义占位长度,如%10s,默认右对齐,左对齐写成%-10s

image.png

浮点数还可以指定小数点后几位,如"%.2f"

【Shell脚本】awk命令_第6张图片

8进制和16进制

【Shell脚本】awk命令_第7张图片


四、模式匹配的两种用法

(1)RegExp:正则表达式

(2)关系运算匹配 == ;>;!=;~;!~;&&;||;!

image.png

【Shell脚本】awk命令_第8张图片

image.png

五、表达式的用法

(1)打印services文件下所有空白行的数量

image.png

(2)计算学生课程分数平均值
【Shell脚本】awk命令_第9张图片

继续优化首行加title

【Shell脚本】awk命令_第10张图片

六、动作中的条件及循环语句

(1)条件语句

    if(条件表达式)

        动作1

    else if(条件表达式)

        动作2

    else

        动作3

可以将引号中的命令写到文件里,然后用awk -f 命令文件 执行文件名

【Shell脚本】awk命令_第11张图片

(2)循环语句(与C语言类似,不同的是变量不用先声明,默认当成0处理)

    while(条件表达式)

    {

        动作

    }

-------------------------------

     do{

        动作

    }while(条件表达式)

-------------------------------

     for(初始化计数器;测试计数器;计数器变更)

     {

        动作

     }

计算1+2+3...100的和,用while、do while、for循环三种方式实现

【Shell脚本】awk命令_第12张图片

do while形式注意判断条件在后面的时候,条件表达式的判断

【Shell脚本】awk命令_第13张图片

【Shell脚本】awk命令_第14张图片

输出平均成绩大于90分的学生具体分数

【Shell脚本】awk命令_第15张图片

输出所有的语文成绩总分、数学成绩总分...显示在最后一列

【Shell脚本】awk命令_第16张图片


七、字符串函数

length(str):计算字符串长度,返回整数长度值

index(str1,str2):在str1中查找str2的位置,返回位置索引,从1计数

tolower(str):转换为小写

toupper(str):转换为大写

substr(str,m,n):从str的m个字符开始,截取n位,返回截取后的子串,从1开始

split(str,arr,fs):按fs切割字符串,结果保存arr,返回切割后子串个数

match(str,RE):在str中按照RE查找,返回索引位置

sub(RE,RepStr,str):在str中搜索符合RE的子串,将其替换为RepStr,只替换第一个。返回替换的个数

gsub(RE,RepStr,str):在str中搜索符合RE的子串,将其替换为RepStr,替换所有。返回替换的个数

【Shell脚本】awk命令_第17张图片

【Shell脚本】awk命令_第18张图片


八、常用选项

-v:参数传递

-f:指定脚本文件

-F:指定分隔符

-V:查看awk版本号

下面为例子:--------------------------------------------

需要重新定义变量来用非awk里的变量,注意引入变量加“”

image.png

【Shell脚本】awk命令_第19张图片


八、shell中和awk中数组用法

(1)shell中数组的用法:

    array=("yyy" "aaa" "bbb" "cc")

  1. 打印元素:echo ${array[2]}  数组下标从0开始

  2. 打印元素个数:echo ${#array[@]}

  3. 打印元素长度:echo ${#array[2]}

  4. 给元素赋值:array[2]="Li"

  5. 删除元素:unset array[2]; unset array,坑:删除后新数组的下标还是删除前的下标

  6. 分片访问:echo $(array[@]:1:3)

  7. 元素内容替换:${array[@]/e/E}只替换第一个e;${array[@]//e/E} 替换所有的e

  8. 数组遍历:

        for a in ${array[@]}

        do

            echo $a

        done

(2)awk中数组的用法:

  1. 生成数组:arr1["aa"]="hello"

  2. 打印元素个数:length(arr1)

  3. 打印元素长度:length(arr1["aa"])

  4. 给元素赋值:arr1["aa"]="world"

  5. 删除元素:delete arr1["aa"]; delete arr1

  6. 遍历数组:

    for(i in arr1)

        print i,arr1[i]


 统计主机上所有TCP连接状态数,并按照每个TCP状态分类,状态如下图

【Shell脚本】awk命令_第20张图片

实现命令如下:

【Shell脚本】awk命令_第21张图片