1. 程序结构: Begin 和 End模块

awk的程序的结构:Begin块,Body块,End块。

  • BEGIN块:BEGIN {awk-commands}

    • BEGIN块在被程序启动时启动,且只执行一次。
    • 这是一个很好的初始化变量的地方,常常被用来修改内置变量RS,FS,OFS,ORS等的值。
    • BEGIN是awk的关键字,必须大写。
    • 可选的
  • BODY块:  /pattern/{awk-commands(action)}

    • 主体块适用于awk的每个输入行命令。
    • 默认情况下,awk执行每一行命令,但可以通过pattern限制。
    • body块没有关键字
  • END块: END {awk-commands}
    • END块在程序结束时执行,在awk读取完所有的文件的时候,再执行的。
    • 一般用来输出一个结果(累加,数组结果)
    • END是awk关键字,必须是大写。
    • 可选的。
[root@oldboy test]# awk 'BEGIN {print "Sr No Name Sub Marks\t"} {print} END{print "****END***"}' marks.txt
Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
****END***

案例:统计文件里面的空行数量

# grep查看文件内的空行数量
[root@oldboy test]# grep -c '^$' /etc/services
16 # 遇到空行print 数量(增量+1)
[root@oldboy test]# awk '/^$/{a=a+1;print a}END{print "Blank Record Count:",a}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Blank Record Count: 16
# 仅输出END块,空行数量
[root@oldboy test]# awk '/^$/{a=a+1} END{print "Blank Record Count:",a}' /etc/services
Blank Record Count: 16

问题: awkfile2.txt 里面 以:为分隔符,区域3 大于15,一共有多少个?

awk -F ":" '$3>15{a=a+1} END{print a}' awkfile2.txt

示例:找出环境变量$PATH中,所有只有三个任意字符的命令,例如:tee,并将它们重定向到command.txt中,要求一行显示1个,并在文件尾部统计他们的个数。

find `echo $PATH|tr ":" " "` -type f -name "???"|awk '{cnt+=1;print $0} END{print "Total Count:",cnt}' >>command.txt

示例:1+2+...+100,加到100的值,用awk实现。

  • awk '{if (a<100) {++a;b+=a;print a,b}}' /etc/services
  • awk 'BEGIN {for (i=1;i<101;++i) {s+=i;print s}}'|tail -1
  • echo |awk 'BEGIN {for (i=1;i<101;++i) {s+=i}} END{print s}'

2. awk数组

  • 数组的索引不必是连续的设定的值;
  • 可以使用字符串或数字作为数组的索引
  • 不需要事先声明数组的大小
  • 数组可以在运行时扩展/收缩

数组的语法:

    array_name[index] = value

其中,array_name是数组的名称,index是数组索引,value是任意值分配给数组的元素。

2.1 创建 array_name[index] = value

[root@oldboy test]# awk 'BEGIN{fruits["mango"]="yellow";fruits["orange"]="orange";print fruits["orange"] "\n" fruits["mango"]}'
orange
yellow

2.2 删除 delete array_name[index]

使用delete语句从数组中删除元素。

[root@oldboy test]# awk 'BEGIN{fruits["mango"]="yellow";fruits["orange"]="orange";delete fruits["orange"];print fruits["mango"];print fruits["orange"]}'
yellow [root@oldboy test]#

2.3 多维数组:用一维数组模拟多维数组

awk只支持一维数组,但是我们可以很容易地模拟使用一维阵列本身的多维阵列。

例如下面是3×3的三维阵列:

100 200 300
400 500 600
700 800 900

另外,在上述示例array[0] [0]存储100,array[0][1]存储200等。要在位置array[0] [0]存储100,我们可以使用下面的语法:

array["0,0"] = 100

虽然我们已经给定0,0为索引,这些都不是两个索引。在现实中,它只是一个索引以字符串0,0。

下面简单的例子模拟2-D数组:

awk 'BEGIN {
array["0,0"] = 100;
array["0,1"] = 200;
array["0,2"] = 300;
array["1,0"] = 400;
array["1,1"] = 500;
array["1,2"] = 600;
# print array elements
print "array[0,0] = " array["0,0"];
print "array[0,1] = " array["0,1"];
print "array[0,2] = " array["0,2"];
print "array[1,0] = " array["1,0"];
print "array[1,1] = " array["1,1"];
print "array[1,2] = " array["1,2"];
}'
在执行上面的代码后,得到以下结果:
array[0,0] = 100
array[0,1] = 200
array[0,2] = 300
array[1,0] = 400
array[1,1] = 500
array[1,2] = 600

我们还可以在排序其元素/索引于阵列执行各种操作。

为了达到这个目的,可以使用AWK的asort以及asorti函数。我们将看到在后面的章节这些函数的使用。

2.4 无序和有序的关联数组

awk中的数组都是关联数组,数字索引也会变成字符串索引:

[root@oldboy test]# awk 'BEGIN {cities[1]="beijing"
> cities[2]="shanghai"
> cities["three"]="guangzhou"
> for (c in cities) {print cities[c]}
> print cities[1]
> print cities[""]
> print cities["three"]
> }'
guangzhou
beijing
shanghai
beijing
beijing
guangzhou

for循环的输出,因为数组是关联数组,默认是无序的。通过for循环得到的是无序的数组。

如果需要得到有序数组,需要通过下标指定获得。

2.5 awk数组的典型应用

案例:用awk查看服务器连接状态并汇总

[root@oldboy test]# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 192.168.0.109:22 192.168.0.102:53242 ESTABLISHED
tcp 0 0 :::80 :::* LISTEN
tcp 0 0 :::22 :::* LISTEN
udp 0 0 0.0.0.0:68 0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 9885 /var/lib/mysql/mysql.sock
unix 2 [ ACC ] STREAM LISTENING 7111 @/com/ubuntu/upstart
unix 2 [ ] DGRAM 7512 @/org/kernel/udev/udevd
unix 5 [ ] DGRAM 9369 /dev/log
unix 2 [ ] DGRAM 209043
unix 2 [ ] DGRAM 20157
unix 2 [ ] DGRAM 9921
unix 3 [ ] DGRAM 7530
unix 3 [ ] DGRAM 7529
[root@oldboy test]# netstat -an|awk '/^tcp/{++s[$NF]} END{for (a in s) print a,s[a]}'
ESTABLISHED 1
LISTEN 4

++s[$NF] 即将s作为数组的名称,索引是$NF,通过++s增量加1的方式,遇到一次s["Listen"]的值加1,非常的高校实用。

等价的表示方式为:

[root@oldboy test]# netstat -an|awk '/^tcp/{state[$NF]+=1;print s state[$NF] $NF} END{for (a in state) print a,state[a]}'
1LISTEN
2LISTEN
1ESTABLISHED
3LISTEN
4LISTEN
ESTABLISHED 1
LISTEN 4

案例:统计web日志访问流量,要求输出访问次数,请求页面或图片,每个请求的总大小,总访问流量的大小汇总。

需要结合httpd服务的日志文件进行解析。

面试题:处理以下文件内容,将 域名计算计数 排序处理(去重)

http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html

答案:

[root@oldboy test]# awk -F "/" '{print $3}' html.txt |sort -rn|uniq -c
3 www.etiantian.org
2 post.etiantian.org
1 mp3.etiantian.org
[root@oldboy test]# awk -F "/" '{++domain[$3];print $3,domain[$3]}' html.txt
www.etiantian.org 1
www.etiantian.org 2
post.etiantian.org 1
mp3.etiantian.org 1
www.etiantian.org 3
post.etiantian.org 2
[root@oldboy test]# awk -F "/" '{++domain[$3]} END{for (a in domain) print a,domain[a]}' html.txt
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3

3. if语句

awk提供了类似C语言的if语句。

if ( $1== "foo" ) {
  if ( $2== "foo" ) {
    print "uno"
  } else
    print "one"
} elseif ($1== "bar" )
  print "two"
} else
  print "three"
}
}

使用if语句还可以将代码:

! /match pattern/ {print $1}

转换成:

{
if ($0 !~/match pattern/) {
print $1
}
}

if语句,它只是测试条件,并执行特定操作,这取决于条件。

if语句语法:

  if (conditon) action

  if (condition) {action1 action2 action3 ... action-n}

if-else语句语法:

  if (conditon) action-1 else action-2

if-else-if阶梯语法:

  if (condition1) action-1 else if (condition2) action2 else if (condtiton3) action3

示例:检查给定的数是否为偶数。

[root@oldboy test]# awk 'BEGIN{num=10;if (num%2==0) printf "%d is even number.\n",num}'
10 is even number.
[root@oldboy test]# awk 'BEGIN{num=10;if (num%2==0) printf "%d is even number.\n else",num; else printf "%d is odd number.\n",num}'
10 is even number.
root@oldboy test]# awk 'BEGIN{num=9;if (num%2==0) printf "%d is even number.\n else",num; else printf "%d is odd number.\n",num}'
9 is odd number.
# if-else-if 示例:
[root@oldboy test]# awk 'BEGIN {
> a=30;
> if (a==10)
> print "a=10";
> else if (a==20)
> print "a=20";
> else if (a==30)
> print "a=30";
> }'
a=30

4. 循环结构:for循环,while循环,do-while循环

4.1 for循环

for循环语法:

for (initalisation; condition; increment/decrement) action

示例:

[root@oldboy test]# awk 'BEGIN{for (i=1;i<=5;++i) print i}'   # 初始化动作i=1;条件i<=5;增量或减量
1
2
3
4
5

4.2 while循环

while循环语法:

while (condition)
  action

awk首先检查条件,如果条件为真,就执行操作,不断重复,只要循环条件满足为真。

[root@oldboy test]# awk 'BEGIN {i=1; while (i<6) {print i; ++i}}'
1
2
3
4
5

4.3 do-while循环

do-while循环语法:

do
  action
while (condition)

do-while循环类似于while循环,不同之处在于测试条件是否在循环结束时进行计算。

do-while循环操作语句被执行至少一次,即使在条件语句的计算结果为假。

[root@oldboy test]# awk 'BEGIN{i=1; do {print i;++i} while (i<6)}'
1
2
3
4
5

4.4 break,continue,exit语句

  • break 结束循环的执行
  • continue 循环内跳到循环的下一次迭代
  • exit 停止脚本的执行。接受一个整数作为参数,这将是awk进程的退出状态代码。如果没有任何参数,则返回状态为0.
[root@oldboy test]# awk 'BEGIN{sum=0; for (i=0;i<20;++i) {sum +=i; if (sum>50) break; else print "Sum =",sum}} '
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45 [root@oldboy test]# awk 'BEGIN{for (i=1; i<=20; ++i) {if (i%2==0) print i; else continue}}'
2
4
6
8
10
12
14
16
18
20 [root@oldboy test]# awk 'BEGIN{sum=0; for (i=0;i<20;++i) {sum +=i; if (sum>50) exit(10); else print "Sum =",sum}}'
Sum = 0
Sum = 1
Sum = 3
Sum = 6
Sum = 10
Sum = 15
Sum = 21
Sum = 28
Sum = 36
Sum = 45

[root@oldboy test]# echo $?  # 检查脚本的返回状态
  10

【三剑客】awk命令2的更多相关文章

  1. Linux awk命令 --三剑客老大

    Linux awk命令 --三剑客老大 基本用法: awk  [参数]  ['找谁{干啥}']  文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...

  2. Linux三剑客之awk命令详解

    一.awk介绍 AWK是一种优良的文本处理工具.它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho .Pet ...

  3. <三剑客> 老大:awk命令用法

    awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一 个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是lin ...

  4. 【三剑客】awk命令

    前言 awk是一种很棒的语言,它适合文本处理和报表生成. 模式扫描和处理.处理文本流. awk不仅仅是Linux系统中的一个命令,而是一种编程语言,可以用来处理数据和生成报告. 处理的数据: 可以是一 ...

  5. Linux 三剑客 -- awk sed grep

    本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...

  6. AWK命令使用

    前言 文本处理三剑客中,grep强在文本查找,sed强在文本处理,现awk强在文本查找后的输出处理.awk可以在处理文本的过程中使用编程结构(变量.条件判断.循环)以及其内置的变量,这就是它强大的地方 ...

  7. 【文本处理命令】之awk命令详解

    一.awk命令简介 awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等.在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将 ...

  8. Shell基本语法---处理海量数据的awk命令

    awk命令 其实是一门编程语言,支持条件判断,数组,循环等功能,与grep,sed被称为linux三剑客 之所以叫AWK是因为取其三位创始人 Alfred Aho,Peter Weinberger, ...

  9. 性能工具之linux三剑客awk、grep、sed详解

    前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...

  10. linux中awk命令(最全面秒懂)

    目录 一:linux中awk命令 1.awk命令简介 2.awk作用 3.awk的语法格式 4.解析awk使用方法 5.参数 6.awk的生命周期 二:awk中的预定义变量 三:awk运行处理规则的执 ...

随机推荐

  1. 深入解读ES6系列(三)

    ES6字符串 哈喽小伙伴们,爱说'废'话的Z又回来了,欢迎来到Super IT曾的博客时间,上一节说了函数,解构赋值和数组的五大将,这一节我们继续我们知识的海洋,一起奋斗不秃头!不足的欢迎提问留言. ...

  2. HTML+CSS:css定位详解之相对定位、绝对定位和固定定位

    相对定位 如果想为元素设置层模型中的相对定位,需要设置position:relative;,它还是会占用该元素在文档中初始的页面空间,通过left.right.top.bottom属性确定元素在正常文 ...

  3. 第一讲:Git分区,配置与日志

    前言 曾经听到过这样一句话:不会git就不要敲代码了.细细品味确实有其中的道理,可能是当事人代码被强行覆盖后的叹息吧! 因此,为了避免这种情况,接下来我们就一起来好好学习git的相关知识吧!不怕你不会 ...

  4. 八、【Docker笔记】使用Dockerfile创建镜像

    在前面我们讲解了基于已有的镜像容器创建和基于本地模板导入两种方式来创建镜像,在这里我们就来说说第三种创建镜像的方式.Dockerfile是一个文本格式的配置文件,我们可以通过Dockerfile快速创 ...

  5. Mac下Web切图常用PS快捷命令

    Mac下 Z 放大镜 双击放大镜   图片会回到100%大小 C 切片工具 B 画笔    alt 在B模式下 吸取颜色 M   选区(默认) 点击第二次M   矩形选区 可以固定大小 shift+c ...

  6. IO操作与IO模型

    目录 一 .IO操作本质 二. IO模型 BIO – 阻塞模式I/O NIO – 非阻塞模式I/O IO Multiplexing - I/O多路复用模型 AIO – 异步I/O模型 三.同步I/O与 ...

  7. HAproxy shell脚本安装

    #!/bin/bash #需要lua-..tar.gz在家目录下 # 编译安装lua #安装编译环境需要的包 yum -y install gcc openssl-devel pcre-devel s ...

  8. bootstrapTest

    <!DOCTYPE html><html lang="zh-CN"> <head> <meta charset="utf-8&q ...

  9. 在java 中一种简单方式的声明静态Map常量的方法

    我现在需要在一个类里面放一个HashMap,往里面放一些数据,每次要从数据库中取数据的时候先查找HashMap,看是否已经存在,若存在就直接提取,若不存在就从数据库中抽取数据之后再放到HashMap中 ...

  10. 理解JSON:3分钟课程

    理解JSON:3分钟课程 博客分类: Java综合 jsonAjaxJavaScriptXMLLISP 本文是从 Understanding JSON: the 3 minute lesson 这篇文 ...