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

引言

---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基础考察

基础知识考查

  1. 只显示第一行

  2. 只显示最后一行

  3. 只显示最后一列

  4. 不显示第一行

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


基础逻辑运算考查

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

clip_image001

awk -F: '{

if ($1=="root")

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

else

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

}' /etc/passwd

clip_image002

awk -F: -v sum=0 '{

if ($3>=500)

{sum++}

}END{

print sum

}' /etc/passwd

clip_image003

2. While

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

awk -F: '{

i=1;

while (i<=3)

{print $i;i++}

}' /etc/passwd

clip_image004

awk -F: '{

i=1;

while (i<=NF)

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

{print $i};

i++ }

}' /etc/passwd

clip_image005

3. do-while

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

awk -F: '{

i=1;

do {print $i;i++}

while(i<=3)

}' /etc/passwd

clip_image006

4. For

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

awk -F: '{

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

{print $i}

}' /etc/passwd

clip_image007

awk -F: '{

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

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

{print $i}}

}' /etc/passwd

clip_image008

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

结果:

clip_image009

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

clip_image011

3. 求每行最小值

awk '

{min=65535;

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

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

print min

}' file

clip_image012

4. 求每行平均值

awk '

{total=0;

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

{total+=$i}

print avg=total/NF

}' file

clip_image013

下节预告:

**《上古神器-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另起栏目,也请大家多支持 *

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


你可能感兴趣的:(FNR,NR,awk用法详解)