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. 监控一哥Prometheus你可认识?

    先大致认识认识普罗米修斯 —— Prometheus. 依据官方文档https://prometheus.io/docs/introduction/overview/ 大概能够了解到 Promethe ...

  2. eclipse导入项目乱码问题及快键键收集

    1.eclipse导入的项目出现乱码,选择该项目,右键选择最下方的Properties,第一个出现的Resource页面: 在Text file encoding项中,选择other. 目前中文编码主 ...

  3. SI24R2F新一代2.4G超低功耗单发射有源RFID芯片 SI24R2E升级版智能充电安全管理方案首选

    目前全国有很多电动车因在充电时电池温度过高,而导致爆炸引起火灾的情况.作为国内RFID行业的推动者,动能世纪联合中科微向IOT应用领域推出新款大功率2.4G射频芯片,并针对电动车防盗.电动车充电桩市场 ...

  4. ThinkPHP3.1.2 使用cli命令行模式运行

    ThinkPHP3.1.2 使用cli命令行模式运行 标签(空格分隔): php 前言 thinkphp3.1.2 需要使用cli方法运行脚本 折腾了一天才搞定 3.1.2的版本真的很古老 解决 增加 ...

  5. Java Random 随机数

    package myrandom; import java.util.Random; /* * Random:用于产生随机数 * * 使用步骤: * A:导包 * import java.util.R ...

  6. Kubernetes 二进制部署

    目录 1.基础环境 2.部署DNS 3.准备自签证书 4.部署Docker环境 5.私有仓库Harbor部署 6.部署Master节点 6.1.部署Etcd集群 6.2.部署kube-apiserve ...

  7. ASE past project:interview & analysis

    采访往届ASE课程学员李潇,他所在的团队blog戳这里http://www.cnblogs.com/smart-code/ Q1:师兄你觉得在团队项目中,有哪些需要注意的事情? A1:团队合作吧.首先 ...

  8. 哈密顿绕行世界问题 HDU2181

    题目大意都比较简单,用vector存一下图,然后爆搜就可以了. #include<bits/stdc++.h> using namespace std; ; vector<]; bo ...

  9. codeforces Equalizing by Division (easy version)

    output standard output The only difference between easy and hard versions is the number of elements ...

  10. windows编译动态链接库,dll+lib的形式

    之前一直在linux上做开发,没怎么关注过windows上如何编译动态链接库.不过一直存疑,为什么windows上的动态链接库是.dll配合.lib使用的,这个又是怎么生成的呢,通过一段时间的查资料和 ...