【三剑客】awk命令2
1. 程序结构: Begin 和 End模块

awk的程序的结构:Begin块,Body块,End块。
- BEGIN块:BEGIN {awk-commands}
- BEGIN块在被程序启动时启动,且只执行一次。
- 这是一个很好的初始化变量的地方,常常被用来修改内置变量RS,FS,OFS,ORS等的值。
- BEGIN是awk的关键字,必须大写。
- 可选的
- 主体块适用于awk的每个输入行命令。
- 默认情况下,awk执行每一行命令,但可以通过pattern限制。
- body块没有关键字
- END块: END {awk-commands}
- END块在程序结束时执行,在awk读取完所有的文件的时候,再执行的。
- 一般用来输出一个结果(累加,数组结果)
- END是awk关键字,必须是大写。
- 可选的。
BODY块: /pattern/{awk-commands(action)}
[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的更多相关文章
- Linux awk命令 --三剑客老大
Linux awk命令 --三剑客老大 基本用法: awk [参数] ['找谁{干啥}'] 文件 参数: -F 分隔符 -v 创建或修改awk变量 OFS 输出分割符 awk显示每一列的时候分隔 ...
- Linux三剑客之awk命令详解
一.awk介绍 AWK是一种优良的文本处理工具.它不仅是 Linux 中也是任何环境中现有的功能最强大的数据处理引擎之一.这种编程及数据操作语言(其名称得自于它的创始人 Alfred Aho .Pet ...
- <三剑客> 老大:awk命令用法
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理.数据可以来自标准输入(stdin).一 个或多个文件,或其它命令的输出.它支持用户自定义函数和动态正则表达式等先进功能,是lin ...
- 【三剑客】awk命令
前言 awk是一种很棒的语言,它适合文本处理和报表生成. 模式扫描和处理.处理文本流. awk不仅仅是Linux系统中的一个命令,而是一种编程语言,可以用来处理数据和生成报告. 处理的数据: 可以是一 ...
- Linux 三剑客 -- awk sed grep
本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...
- AWK命令使用
前言 文本处理三剑客中,grep强在文本查找,sed强在文本处理,现awk强在文本查找后的输出处理.awk可以在处理文本的过程中使用编程结构(变量.条件判断.循环)以及其内置的变量,这就是它强大的地方 ...
- 【文本处理命令】之awk命令详解
一.awk命令简介 awk 是一种很棒的语言,它适合文本处理和报表生成,其语法较为常见,借鉴了某些语言的一些精华,如 C 语言等.在 linux 系统日常处理工作中,发挥很重要的作用,掌握了 awk将 ...
- Shell基本语法---处理海量数据的awk命令
awk命令 其实是一门编程语言,支持条件判断,数组,循环等功能,与grep,sed被称为linux三剑客 之所以叫AWK是因为取其三位创始人 Alfred Aho,Peter Weinberger, ...
- 性能工具之linux三剑客awk、grep、sed详解
前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...
- linux中awk命令(最全面秒懂)
目录 一:linux中awk命令 1.awk命令简介 2.awk作用 3.awk的语法格式 4.解析awk使用方法 5.参数 6.awk的生命周期 二:awk中的预定义变量 三:awk运行处理规则的执 ...
随机推荐
- Java 程序该怎么优化?(工具篇)
程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...
- VMware中虚拟机克隆后多台主机网络冲突
在Vmware中将虚拟机的一台centos7机器克隆了3台,然后启动机器后出现机器都能够上网,但是无法在本地xshell中同时进行连接,且连接的某一台虚拟机都会经常中断 虚拟机克隆后,会遇到的问题: ...
- django->基本操作和新建项目常用配置
一.安装django pip install django==2.1.5 -U #安装django/升级最新版本 二.创建.启动django项目 django-admin startproject m ...
- vue中axios的安装使用
axios是一个基于 promise 的 HTTP 库,在vue中axios是比较常用的网络请求方法. 安装 npm install axios -S 在main.js配置 import axios ...
- Struts2-学习笔记系列(13)-类型转换异常和校验器
Struts2框架有默认的类型转换错误拦截机制,该配置在struts-default.xml中,名叫conversionError,但是想使用需要继承ActionSupport. 默认的错误提示信息是 ...
- linux 块设备简要介绍
1. 块设备简单分类:SCSI块设备和LVM逻辑卷块设备: 2. 创建块设备需要两个linux内核函数:alloc_disk:add_disk; alloc_disk:用于分配一个gendisk结构体 ...
- python 自动生成model 文件 案例分析
生成方式 Python中想要自动生成 model文件可以通过 sqlacodegen这个命令来生成对应的model文件 sqlacodegen 你可以通过pip去安装: pip install sql ...
- pinpoint php 使用不当引发棘手的问题 --psid sid tid pname ptype ah
Pinpoint 简单介绍 Pinpoint 是用 Java 编写的 APM(应用性能管理)工具,用于大规模分布式系统,以帮助分析系统的总体结构以及分布式应用程序的组件之间是如何进行数据互联的. 安装 ...
- 012-C语言小游戏之推箱子
012-C语言小游戏之推箱子 一.创建游戏地图 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #define ROWS 11 #define COLS 12 char ...
- 2019-07-31【机器学习】无监督学习之降维NMF算法 (人脸特征提取)
代码 from numpy.random import RandomState #加载RandomState用于创建随机种子 import matplotlib.pyplot as plt from ...