引言

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

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

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

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

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

全文总目录

引言... 1

目录... 2

AWK基础考察... 3

字符串分隔... 4

打印特殊行列... 7

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

逻辑运算... 12

匹配模式... 15

三元条件表达式... 15

四种书写模式... 16

AWK单/双引号... 16

函数... 17

数组... 19

实战需求: 22


**上古神器-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

四种书写模式... 16

建议用单引号... 16

函数... 17

数组... 19


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

* 为不影响读者感官: *

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

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