当前位置 : 主页 > 操作系统 > centos >

上古神器-AWK中高级实例分享-上

来源:互联网 收集:自由互联 发布时间:2022-06-20
引言 ---AWK,Sed Linux下流处理的上古神器. I 本次分享针对有一定基础的同学,基础知识请自行google,进行本次分享前最好能自主完成 《AWK基础考察》 II 学习期间查阅不少资料,略过零乱,故自

引言

---AWK,Sed Linux下流处理的上古神器.

I> 本次分享针对有一定基础的同学,基础知识请自行google,进行本次分享前最好能自主完成《AWK基础考察》

II> 学习期间查阅不少资料,略过零乱,故自行整理;

III> 如有雷同,纯属巧合;

IV> 引用前请说明引用源地址--http://fengzhilinux.blog.51cto.com/,请尊重作者的劳动成果.

全文总目录

引言... 1

目录... 2

AWK基础考察... 3

字符串分隔... 4

  • 案例1<index函数>. 4

  • 案例2<substr函数>. 5

  • 案例3<match函数>. 6

  • sub/gsub区别及用法... 6

  • 字符串函数tolower /toupper. 7

打印特殊行列... 7

  • a> 只显示第一行... 7

  • b> 只显示最后一行... 7

  • c> 只显示最后一列... 8

  • d> 不显示第一行... 8

  • e> 不显示最后一列(循环+非循环方式)... 8

AWK流控制语句学习... 8

  • if-else. 8

  • While. 10

  • do-while. 10

  • For. 11

  • Case. 12

  • break 和 continue. 12

  • next. 12

逻辑运算... 12

  • 样本文件 file. 12

  • 多列求和... 13

  • 求每行最大值... 13

  • 求每行最小值... 14

  • 求每行平均值... 14

匹配模式... 15

  • 等于==. 15

  • 模糊匹配~. 15

  • 大于... 15

  • 逻辑匹配 &&.. 15

  • 空行匹配... 15

三元条件表达式... 15

四种书写模式... 16

AWK单/双引号... 16

函数... 17

  • Getline函数... 17

  • Close()函数... 18

  • System() 函数... 18

  • Nextfile. 18

  • 时间函数Strftime() systime() 18

  • 自定义函数... 19

数组... 19

  • 一维数组元素提取及排序... 19

  • 二维数组元素提取(split) 21

  • 系统变量的数组... 21

  • 删除数组... 22

实战需求: 22

  • 求1-100和... 22

  • 打印第一列相同第二列最大值... 22

  • 打印第一列相同值出现次数... 24

  • 两列求最大值... 24

  • 多列求最大值... 25

  • 除第一列外所有值求和... 25

  • 相同列求和... 26

  • 相同字段求最大值最小值,相同字段出现的次数... 27

  • FNR,NR巧用/不同字段对应列替换... 28

  • 案例分析... 30

  • apache-log日志分析... 31

  • 知阵转换... 33

  • 行列对调案例分析... 34

  • 相同字段的其它内容放相同行... 35

  • 相同字段的其它内容放相同行且补充字段... 35

  • Split分割字符串实例... 36

  • 格式化输出... 38

  • FR,NFR双关联 注册账户统计... 40

  • 统计系统netstat 状态及各状态连接数... 41


**上古神器-AWK中高级实例分享-上**

AWK基础考察

基础知识考查

  • 只显示第一行

  • 只显示最后一行

  • 只显示最后一列

  • 不显示第一行

  • 不显示最后一列(循环+非循环方式)


  • 基础逻辑运算考查

    n 文本处理

    $ cat files

    85 92 78 94 88

    89 90 75 90 86

    84 88 90 92 84

    1. 求每行总和

    2. 求每行最大值

    3. 求每行最小值

    4. 求每行平均值:


    字符匹配

    $ cat test_tem/grade

    john 10 3 78 94 88

    andrea 20 90 75 90 86

    jasper 90 150 90 92 84

    apple 90 85 76 90 87

    sun 60 50 80 98 87

    month 100 120 130 80 90

    sam 90 85 78 92 90

    1. 打印第一列为sun的行

    2. 打印第二列大于40的行

    3. 打印第一列字符长度大于4且第二列大于50的行

    4. 计算文件空行数

    打印特殊行列

    a> 只显示第一行

    awk 'NR==1' file

    b> 只显示最后一行

    awk 'END{print $0}' file

    c> 只显示最后一列

    awk '{print $NF}' file

    d> 不显示第一行

    awk 'NR != 1' grade

    e> 不显示最后一列(循环+非循环方式)

    ##循环方式:

    awk 'BEGIN{OFS="";ORS=""}{for(i=1;i<NF;i++){printf $i" "}{print "\n"}}' file

    ##非循环方式:

    awk 'NF--{print NF}' file

    AWK流控制语句学习

    1. if-else

    语法:if (condition) {then-body} else {[ else-body ]}

    例子:

    awk -F: '{

    if ($1=="root")

    {print $1, "Admin"}

    else

    {print $1, "Common User"}

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_FNR

    awk -F: '{

    if ($1=="root")

    {printf "%-15s: %s\n", $1,"Admin"}

    else

    {printf "%-15s: %s\n", $1, "Common User"}

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_FNR_02

    awk -F: -v sum=0 '{

    if ($3>=500)

    {sum++}

    }END{

    print sum

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_FNR_03

    2. While

    语法: while (condition){statement1; statment2; ...}

    awk -F: '{

    i=1;

    while (i<=3)

    {print $i;i++}

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_awk用法详解_04

    awk -F: '{

    i=1;

    while (i<=NF)

    { if (length($i)>=4)

    {print $i};

    i++ }

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_NR_05

    3. do-while

    语法: do {statement1, statement2, ...} while (condition)

    awk -F: '{

    i=1;

    do {print $i;i++}

    while(i<=3)

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_FNR_06

    4. For

    语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}

    awk -F: '{

    for(i=1;i<=3;i++)

    {print $i}

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_awk用法详解_07

    awk -F: '{

    for(i=1;i<=NF;i++)

    { if (length($i)>=4)

    {print $i}}

    }' /etc/passwd

    上古神器-AWK中高级实例分享-上_awk用法详解_08

    5. Case

    语法:switch (expression) { case VALUE or /REGEXP/: statement1, statement2,... default: statement1, ...}

    6. break 和 continue

    常用于循环或case语句中

    7. next

    提前结束对本行文本的处理,并接着处理下一行;例如,下面的命令将显示其ID号为奇数的用户:

    awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd



    逻辑运算

    样本文件

    85 92 78 94 88

    89 90 75 90 86

    84 88 90 92 84

    1. 多列求和

    awk '

    { ##主体函数以"{"开始

    for(i=1;i<NF;i++) ##设置循环体,

    {a[NR]+=$i} ##赋值到数组,

    } ##主体函数"}"闭合

    END{ ##END函数

    for(i in a) ##读取数组

    {print i,a[i]} ##打印数key,及value

    }' file

    结果:

    上古神器-AWK中高级实例分享-上_NR_09

    2. 求每行最大值

    awk '

    { ##主体函数以"{"开始

    max=-65535 ##设变量max[awk会自动判断变量类型]

    for(i=1;i<=NF;i++) ##设置循环体,

    {max=($i>max)? $i:max} ##awk 三元表达式 如果$i>max 则max=$i,否则max=max

    print max ##打印出来max

    }' file

    上古神器-AWK中高级实例分享-上_NR_10

    3. 求每行最小值

    awk '

    {min=65535;

    for(i=1;i<=NF;i++)

    {min=($i<min)? $i:min};

    print min

    }' file

    上古神器-AWK中高级实例分享-上_NR_11

    4. 求每行平均值

    awk '

    {total=0;

    for(i=1;i<=NF;i++)

    {total+=$i}

    print avg=total/NF

    }' file

    上古神器-AWK中高级实例分享-上_awk用法详解_12

    下节预告:

    **《上古神器-AWK中高级实例分享-中》**


    匹配模式... 15

    • 等于==. 15

    • 模糊匹配~. 15

    • 大于... 15

    • 逻辑匹配 &&.. 15

    • 空行匹配... 15

    三元条件表达式... 15

    四种书写模式... 16

    建议用单引号... 16

    函数... 17

    • Getline函数... 17

    • Close()函数... 18

    • System() 函数... 18

    • Nextfile. 18

    • 时间函数Strftime() systime() 18

    • 自定义函数... 19

    数组... 19

    • 一维数组元素提取及排序... 19

    • 二维数组元素提取(split) 21

    • 系统变量的数组... 21

    • 删除数组 22


    *****************************************************************************************

    * 为不影响读者感官: *

    * http://fengzhilinux.blog.51cto.com/1343279/1320317另起栏目,也请大家多支持 *

    *****************************************************************************************


    上一篇:RHEL6基础二十二之RHEL软件包管理①rpm
    下一篇:没有了
    网友评论