AWK是一种优良的文本处理工具。它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一。下面让我们一起来学习这个强大工具的使用把!!!,
1) 基本语法格式
awk [options] 'action' file file
awk [options] 'PATTERN{action}' file file.....
2) awk的输出方式
#==============
print [item1,item2...]
如果item被省略,则默认输出整行,即为$0,
如果想输出空白,使用print “”
#===============
printf “format”, item.....
注意:默认不会自动换行,需要换行要使用/n
format中可以使用的修饰符
%c:显示为accii码
%d,%i:显示十进制整数
%e,%E:科学计数法显示
%f:显示浮点数
%g,%G:以科学计数法格式或浮点数格式显示数值
%u:显示无符号整数
%s:显示字符串
%%:显示一个”%”
修饰符格式控制字符(用在%和字母中间,如%20s)
#:显示#个字符的宽度
#.*:*表示数值类型取值精度
-:左对齐,默认为右对齐
+:显示数值符号
3) awk的输出重定向
print items > output-file
print items >> output-file
print items | command
特殊文件描述符:
/dev/stdin: 标准输入
/dev/stdout: 标准输出
/dev/stderr: 错误输出
4) awk的操作符
算数运算符
x+y:加法运算 x-y:减法运算 x*y:乘法运算 x/y:除法运算 x%y:取模 x**y,x^y:x的y次方
| 赋值操作符:
= :将后边的值赋值给前边 x+=y : x-=y: *= /= %= ^=;**= ++ --
|
比较操作符: < :小于 <= :小于等于 > :大于 >= :小于 == :等于 != :不等于 ~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假; !~:模式匹配,左边的字符串能够被右边的模式所匹配为假,否则为\真; | 逻辑操作符: ||:或操作,如果前边为真,则执行后后边的语句 &&:与操作;如果前边为假,则执行后边的语句 |
字符串运算 连接
| |
条件表达式: A?B:C:如果A条件成立,则执行B,否则执行C语句 | |
函数调用方式: fuction_name(arg1,[arg2][,....]) |
5) awk中的模式:
正则表达式:格式为/PATTERN/
仅处理被pattern匹配到的行
Expression::表达式,其结果为非零或非空字符串时满足条件
仅处理满足条件的行
Ranges:行范围,startline,endline仅
处理范围内的行
BEGIN/END:特殊模式,
仅在awk的progream运行前BEGIN或运行后END执行一次
Empty:空模式,
匹配任意行,
6) awk常见的action
.Exporessions
.控制语句
.组合语句
.输入语句
.输出语句
7) awk中的控制语句
1.if-else语句
if (判断语句){条件为真语句} else {条件为假语句}
2.while语句
while (判断语句) {循环体}
循环,直到条件不满足位置
3.di-while语句
do {循环体} while (判断语句)
先执行一遍循环体,再进行判断是否进入循环,直到条件不满足时跳出循环
4.for循环
for (变量定义;判断条件;修正语句){循环体}
执行顺序为:定义变量-->判断条件-->条件为真-->执行循环体 -->修正语句 -->跳转到条件判断
┗->条件为假,跳出循环
5.case语句
swatch (expression) {case Value:语句;case /Expression/:语句2.......default:语句N}
6.循环控制语句
break:提前跳出循环
continue:提前跳出本轮循环,进入下一轮循环
7.next
提前跳出对本行的处理,转而对下一行进行处理
8) 数组
关联数组
arrary_name[下标]
下标可以使用任意字符串; 如果某数组元素事先不存在,那么在引用时,awk会自动创建此元素并将其初始化为空串;因此,要判断某数组是否存在某元素,必须使用“index in array”这种格式进行判断
在关联数组中要遍历数组中的每一个元素,需要使用如下特殊结构:
for (var in array) {for body}
数组元素的删除
delete arrary_name[下标]
9) awk中的一些内置函数
split(字符串,数组名[,分隔符])
如果没有指定分隔符,默认为FS
此函数的返回值为切片后的元素格式
length(String)
返回字符串的长度
substr(String,Start[,Length])
取字符串中的子串,从Start开始取String长度为Length的字符串
10) 两个AWK小例子
#返回当前各种类型的TCP连接的个数 [root@host1 ~]# netstat -tnap |awk '/^tcp/{state[$6]++}END{for (i in state) {print i,":",state[i]}}' ESTABLISHED : 1 LISTEN : 10 #返回每个IP地址的连接数 [root@host1 ~]# netstat -tn | awk '/^tcp/{split($5,ip,":");ipsum[ip[1]]++}END{for (i in ipsum) {printf "%s\t%s\n",i,ipsum[i]}}' 172.16.21.2514 #格式控制字符的使用 [root@host2 tawk 'BEGIN{printf "%15s %s\n","abcde","12345"}' abcde 12345 [root@host2 test]# awk 'BEGIN{printf "%-15s %s\n","abcde","12345"}' abcde 12345