引言
---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基础考察
基础知识考查
基础逻辑运算考查 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 四种书写模式... 16 建议用单引号... 16 函数... 17
数组... 19
|
*****************************************************************************************
* 为不影响读者感官: *
* http://fengzhilinux.blog.51cto.com/1343279/1320317另起栏目,也请大家多支持 *
*****************************************************************************************