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:xy次方

 

赋值操作符:

 

= :将后边的值赋值给前边

    x+=y :

    x-=y:

    *=

    /=

    %=

    ^=;**=

    ++

    --

 

比较操作符:

<  :小于

<= :小于等于

>  :大于

>= :小于

== :等于

!= :不等于

~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假;

!~:模式匹配,左边的字符串能够被右边的模式所匹配为假,否则为\真;

逻辑操作符:

||:或操作,如果前边为真,则执行后后边的语句

&&:与操作;如果前边为假,则执行后边的语句

字符串运算

    连接

 

条件表达式:

    A?B:C:如果A条件成立,则执行B,否则执行C语句

函数调用方式:

      fuction_name(arg1,[arg2][,....])

 

5) awk中的模式:

    正则表达式:格式为/PATTERN/

        仅处理被pattern匹配到的行

    Expression::表达式,其结果为非零或非空字符串时满足条件

        仅处理满足条件的行

    Ranges:行范围,startline,endline

    处理范围内的行

    BEGIN/END:特殊模式,

    仅在awkprogream运行前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