引言
---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 -F: '{
if ($1=="root")
{printf "%-15s: %s\n", $1,"Admin"}
else
{printf "%-15s: %s\n", $1, "Common User"}
}' /etc/passwd
awk -F: -v sum=0 '{
if ($3>=500)
{sum++}
}END{
print sum
}' /etc/passwd
2. While
语法: while (condition){statement1; statment2; ...}
awk -F: '{
i=1;
while (i<=3)
{print $i;i++}
}' /etc/passwd
awk -F: '{
i=1;
while (i<=NF)
{ if (length($i)>=4)
{print $i};
i++ }
}' /etc/passwd
3. do-while
语法: do {statement1, statement2, ...} while (condition)
awk -F: '{
i=1;
do {print $i;i++}
while(i<=3)
}' /etc/passwd
4. For
语法: for ( variable assignment; condition; iteration process) { statement1, statement2, ...}
awk -F: '{
for(i=1;i<=3;i++)
{print $i}
}' /etc/passwd
awk -F: '{
for(i=1;i<=NF;i++)
{ if (length($i)>=4)
{print $i}}
}' /etc/passwd
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
结果:
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
3. 求每行最小值
awk '
{min=65535;
for(i=1;i<=NF;i++)
{min=($i<min)? $i:min};
print min
}' file
4. 求每行平均值
awk '
{total=0;
for(i=1;i<=NF;i++)
{total+=$i}
print avg=total/NF
}' file
下节预告:
**《上古神器-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另起栏目,也请大家多支持 *
*****************************************************************************************