第1章 awk命令基础

1.1 awk命令执行过程

1、如果BEGIN 区块存在,awk执行它指定的动作。
2、awk从输入文件中读取一行,称为一条输入记录。如果输入文件省略,将从标准输入读取
3、awk将读入的记录分割成字段,将第1个字段放入变量$1中,第2个字段放入$2,以此类推。$0表示整条记录。字段分隔符使用shell环境变量FS或由参数指定。
4、把当前输入记录(数据行)依次与每一个awk命令中awk条件比较,看是否匹配,如果相匹配,就执行对应的动作。如果不匹配,就跳过对应的动作,直到比较完所有的awk命令。
5、当一条输入记录比较了所有的awk命令后,awk读取输入的下一行,继续重复步骤3和4,这个过程一直持续,直到awk读取到文件尾。
6、当awk读完所有的输入行后,如果存在END,就执行相应的动作。

1.2 awk中模式与动作

'pattern{action}'

1.2.1 在awk眼中的行与列

field     字段,列
record 记录,行

1.3 awk默认有一把“菜刀”

空格系列 (单独的空格,连续的空格,tab键)

-F        指定分隔符

-vFS

FS  == field sep       每一列的分隔符

OFS ==output field sep  输出每一列的时候使用的分隔符

1.4 awk的内置变量

变量

含义

英文全写

FS  

每一列的分隔符

field sep

NF  

每一行有多少列

number  of field

OFS 

输出每一列的时候使用的分隔符

output field sep

NR  

记录号 行号

number of record

RS  

每一行的分隔符(每一行的结束标记)

 

$数字

取某一列

 

$0  

取出这一行

 

1.4.1 $NF的使用

$NF 表示最后一列,(NF-1)表示倒数第二列,以此类推。

[root@znix ~]# awk -F: '{print NF}' passwd.txt
7
7
……
[root@znix ~]# awk -F: '{print $NF}' passwd.txt
/bin/bash
/sbin/nologin
/sbin/nologin
[root@znix ~]# awk -F: '{print $(NF-1)}' passwd.txt
/root
/bin
/sbin

1.5 【练习题】awk如何使用正则?

1)      显示Xiaoyu的姓氏和ID号码

2)      显示所有ID号码最后一位数字是1或5的人的全名

3)      姓氏是Zhang的人,显示他的第二次捐款金额及她的名字

4)      显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

1.5.1 环境准备

mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF

1.5.1.1 内容释义:

第一列是姓氏

第二列是名字

第一第二列合起来就是姓名

第三列是对应的ID号码

最后三列是三次捐款数量

1.5.2 显示出第二列中包含X 的。

$2~表示第二列所有的内容。 ~表示所有

在这里X比较特殊,是大写的,awk中区分大小写。

[root@znix files]# awk '$2~/X/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wang Xiaoai 3515064655 :50:95:135

1.5.3 显示Xiaoyu的姓氏和ID号码

[root@znix files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151

1.5.4 显示所有ID号码最后一位数字是1或5的人的全名

[root@znix files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt

[root@znix files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai

1.5.5 姓氏是Zhang的人,显示他的第二次捐款金额及她的名字

先找到,再进行输出。(NF-1) 表示倒数第二列。

[root@znix files]# awk -F "[ :]+" '$1~/Zhang/{print $2,$(NF-1)}' reg.txt
Dandan 100
Xiaoyu 90

1.5.6 显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

tr 命令进行替换,格式比较简单tr  "要替换什么" "替换成什么"

[root@znix files]# awk '$2~/Xiaoyu/{print $4}' reg.txt |tr ":" "$"
$155$90$201
[root@znix files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201

1.6 awk中的$0是什么鬼?

$0表示文件中整条记录(行)的内容,在这里加$0 与不加$0 相同。

[root@znix files]# awk '/Zhang/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
[root@znix files]# awk '$0~/Zhang/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201

1.7 awk中的替换

在awk中,可以用来替换的有三个函数:sub gsub gensub

1.7.1 使用gusb 函数进行替换

gsub(r, s [, t])

r  /找谁/

s  "替换成什么"

[] 替换那个部分的

表示为: gsub(/找谁/,"替换成什么",替换那个部分的)

1.7.2 替换文本中的内容

题目:显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135

中间使用分号分割 ;

[root@znix files]# awk '{gsub(/:/,"$",$NF);print $0}' reg.txt
Zhang Dandan 41117397 $250$100$175
Zhang Xiaoyu 390320151 $155$90$201
Meng Feixue 80042789 $250$60$50
Wu Waiwai 70271111 $250$80$75
Liu Bingbing 41117483 $250$100$175
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175

添加上限定条件后,取到的结果会更加的精确。

[root@znix files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201

1.8 【练习题】判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin),如果是显示用户名字

不包含:,在awk中不包含可以使用表示。

$NF        表示这个文件的最后一列

-F             将分隔符指定为:

[root@znix ~]# awk -F: '$NF!~/nologin$/{print $1}' /etc/passwd
root
sync
shutdown
halt
clsn
oldgirl
test
stu01
stu02
stu03
znix

1.8.1 【对齐】输出的结果更美观整齐--column命令

-t  -t参数让他对齐。

[root@znix files]# awk 'BEGIN{print "姓","名"}{print $1,$2}' reg.txt |column -t
姓 名
Zhang Dandan
Zhang Xiaoyu
Meng Feixue
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Zi Gege
Li Youjiu
Lao Nanhai

第2章 awk中BEGIN 和 END

2.1 怎么把正则表达式作为条件

BEGIN:开始

里面的内容会在awk读取文件之前运行

在BEGIN里面定义awk的内置变量

END

END{} 里面放入内容,在读取完文件内容后执行

先计算,在END里面输出结果

先计算再输出

2.1.1 【一个栗子】执行完输出后,再输出一个“结束”

[root@znix files]# awk '{print $0}END{print "结束"}' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
结束

2.2 【企业案例】统计/etc/services文件里面的空行数量

2.2.1 使用awk的END模式

前面的i++先进行计算,再输出结果。

i=i+1 与i++ 相同。

[root@znix ~]# awk '/^$/{i=i+1}END{print i}' /etc/services
16
[root@znix ~]# awk '/^$/{i++}END{print i}' /etc/services
16

2.2.2 查看i++的执行过程

i++与i=i+1相同。

i=i+$0  累计相加 计算总和

i=i+1  i++   计数

[root@znix ~]# awk '/^$/{i++;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

2.2.3 其他方法:

uniq -c  uniq 命令把相邻两行一样的合并,-c为统计出现的次数

[root@znix ~]# awk '/^$/' /etc/services|uniq -c
16
[root@znix ~]# awk '/^$/' /etc/services|wc -l
16

2.3 【案例】seq 100 >num.txt ,计算这个文件每一行相加的结果

i=i+$0  累计相加 计算总和

i=i+1  i++   计数

没有赋初始值的时候
i++ 先返回0,再加1,第二次调用的时候先返回1,再加1,以此类推

[root@znix ~]# awk '{i=i+$0}END{print i}' num.txt
5050

第3章 awk数组

3.1 数组是用来做什么的?

分类计算,用于统计。

3.1.1 他能够干些什么?

统计日志文件中 图片.jpg 出现了多少次

统计日志文件中 图片.png 出现了多少次

统计更累的信息

3.2 数组详解---"酒店"

假设我们有一个酒店

酒店<===>hotel
酒店里面有几个房间110,119,120,114,401这几个房间。
酒店的110房间<===> hotel[110]
酒店的119房间<===> hotel[119]
酒店的120房间<===> hotel[121]

酒店房间里面入住客人

3.2.1 如何查看房间里住的是哪位客人?

[root@znix files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";print hotel[110],hotel[121],hotel[119]}'
lidao taojin tanjiaoshou

3.2.2 使用for语句,对酒店进行循环/查房

awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin";
for(pol in hotel)
print pol,hotel[pol]
}'

格式:

for(变量 in 数组)  使用变量对酒店进行循环/查房

print pol,hotel[pol] :

pol       得到-房间的号码

hotel[pol] 哪个酒店的哪个房间

[root@znix files]# awk 'BEGIN{hotel[110]="lidao" ;hotel[119]="tanjiaoshou";hotel[121]="taojin"
> for(pol in hotel)
> print pol,hotel[pol]
> }'
110 lidao
121 taojin
119 tanjiaoshou

3.3 【企业面试题】统计域名访问次数(去重统计)。处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)

http://www.nmtui.com/index.html
http://www.nmtui.com/1.html
http://post.nmtui.com/index.html
http://mp3.nmtui.com/index.html
http://www.nmtui.com/3.html
http://post.nmtui.com/2.html

3.3.1 方法一:sort uniq

uniq 命令 把相邻两行一样的合并

[root@znix ~]# awk -F '[/]+' '{print $2}' www.txt |uniq -c
2 www.nmtui.com
1 post.nmtui.com
1 mp3.nmtui.com
1 www.nmtui.com

sort 排序,默认是按照字母的顺序

[root@znix ~]# awk -F '[/]+' '{print $2}' www.txt |sort
mp3.nmtui.com
post.nmtui.com
www.nmtui.com
www.nmtui.com
www.nmtui.com

3.3.2 方法2 awk数组

3.3.2.1 第一步 取出域名

[root@znix ~]# awk -F '[/]+' '{print $2}' www.txt
www.nmtui.com
www.nmtui.com
post.nmtui.com
mp3.nmtui.com
www.nmtui.com

3.3.2.2 第二步 显示

; 两条命令之间用分号分割。

[root@znix ~]# awk -F '/+' '{hotel[$2]++;print hotel["www.nmtui.com"]}' www.txt
1
2
2
2
3

3.3.2.3 第三步 显示结果

[root@znix ~]# awk -F '/+' '{hotel[$2]++}END{for(pol in hotel)print pol,hotel[pol]}' www.txt
mp3.nmtui.com 1
post.nmtui.com 1
www.nmtui.com 3

第4章 课后题目:

两个文件  secure.zip  access.zip

4.1 统计secure文件中谁在破解你的密码(统计出破解你密码的ip地址出现的次数)

4.1.1 方法一

[root@znix test]# awk '/Failed/{fa[$(NF-3)]++}END{for(pol in fa)print pol,fa[pol]}' secure-20161219|column -t
218.65.30.126 17163
218.65.30.61 17163
125.16.71.175 4
169.46.38.74 9
183.136.238.78 30
218.2.0.16 10
122.228.238.66 1
……

4.1.2 方法二

[root@znix test]# awk '/Failed/{print $(NF-3)}' secure-20161219 |sort|uniq -c|sort -n  

4.1.3 结果统计

[root@znix test]# awk '/Failed/{fa[$(NF-3)]++}END{for(pol in fa)print pol,fa[pol]}' secure-20161219|column -t|wc -l
88

4.2 统计access.log文件中对ip地址去重并统计重复数

[root@znix test]# awk '{hotel[$1]++}END{for(pol in hotel)print pol,hotel[pol]}' access.log |head -3
101.226.125.115 284
180.154.137.177 516
101.226.125.116 127

4.3 统计access.log文件中网站一共使用了多少流量

[root@znix test]# awk '{i=i+$10}END{print i}' access.log
2478496663

AWK高端功能-数组的更多相关文章

  1. .NET程序员走向高端必读书单汇总

    .NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 4. 操作系统 5. 计算机网络 6. ...

  2. web前端开发常用的10个高端CSS UI开源框架

    web前端开发常用的10个高端CSS UI开源框架   随着人们对体验的极致追求,web页面设计也面临着新的挑战,不仅需要更人性化的设计理念,还需要设计出更酷炫的页面.作为web前端开发人员,运用开源 ...

  3. 【转载】.NET程序员走向高端必读书单汇总

    原文:.NET程序员走向高端必读书单汇总 .NET程序员走向高端必读书单汇总 一.知识树 1. 基本能力 1.1 数学 1.2 英语 1.3 语言表达 2. 计算机组织与体系结构 3. 算法与数据结构 ...

  4. 【干货】教你如何利用fullPage.js以及move.js插件打造高端大气的网站效果!

    前言: 如今我们经常能见到全屏网站,尤其是国外网站.这些网站用几幅很大的图片或色块做背景,再添加一些简单的内容,显得格外的高端大气上档次. 在学习过jQuery插件之后,才发现之前的很多网站特效完全可 ...

  5. 免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐

    免费高端出辕营,横空出世惊鬼神 Excel插件:ExcelPower_Helper 0.41初出茅庐        隐鹤 倾心开发 2019.4.1 1.   引言 经过前后大约零零散散的一年的开发, ...

  6. 高端内存映射之kmap_atomic固定映射--Linux内存管理(二十一)

    1 固定映射 1.1 数据结构 linux高端内存中的临时内存区为固定内存区的一部分, 对于固定内存在linux内核中有下面描述 x86 arm arm64 arch/x86/include/asm/ ...

  7. 高端内存映射之kmap持久内核映射--Linux内存管理(二十)

    1 高端内存与内核映射 尽管vmalloc函数族可用于从高端内存域向内核映射页帧(这些在内核空间中通常是无法直接看到的), 但这并不是这些函数的实际用途. 重要的是强调以下事实 : 内核提供了其他函数 ...

  8. 高端内存映射之vmalloc分配内存中不连续的页--Linux内存管理(十九)

    1 内存中不连续的页的分配 根据上文的讲述, 我们知道物理上连续的映射对内核是最好的, 但并不总能成功地使用. 在分配一大块内存时, 可能竭尽全力也无法找到连续的内存块. 在用户空间中这不是问题,因为 ...

  9. Linux内存描述之高端内存--Linux内存管理(五)

    1. 内核空间和用户空间 过去,CPU的地址总线只有32位, 32的地址总线无论是从逻辑上还是从物理上都只能描述4G的地址空间(232=4Gbit),在物理上理论上最多拥有4G内存(除了IO地址空间, ...

随机推荐

  1. 铁乐学Python_day11_闭包函数

    一.[函数名] 1)函数名本质上它也是一种变量,特殊的变量: (碰到同名其它变量,依照从上往下的代码执行赋值.) 单独打印函数名,输出的是它对应的内存地址: 例: def funcl(): print ...

  2. docker及服务器遇到的坑

    目录 DNS不可用 修改docker查找源 容器保持固定ip 查看docker连接 容器间通信 容器拷贝数据 php连接docker mysql 8.0出错authentication method ...

  3. 第 6 章 C控制语句:循环

    6.16.3 使用嵌套循环,按下面格式打印字母: F FE FED FEDC FEDCB FEDCBA #include <stdio.h> int main() { ; ); row ! ...

  4. c++程序员学习go

    作为一个c++程序员学习go编程的笔记.首先声明本人文笔太差,当你阅读一点觉得实在无法阅读下去时请移步. 下载安装go,安装完毕后会增加系统环境变量path内容指定go程序所在目录,可以打开cmd输入 ...

  5. python第十四课--排序及自定义函数之自定义函数(案例三)

    return关键字的使用:1).结束函数 2).将结果返回给函数的调用者/调用处 [注意事项]1).与return同一作用范围内的后面不要显示书写任何代码,因为永远不可能被执行到,不会报错. 2).r ...

  6. 【模板】.bat对拍

    对拍是个很有用的东西,比如在验证贪心策略是否正确时,可以写上个暴力然后和贪心程序对拍上几个小时. 在c++里用system写对拍总是会出现一些莫名其妙的问题.. 比如my.out明明是1 fc的时候却 ...

  7. ES6新特性3:函数的扩展

    本文摘自ECMAScript6入门,转载请注明出处. 一.函数参数默认值 1. ES6允许为函数的参数设置默认值,即直接写在参数定义的后面. function log(x, y = 'World') ...

  8. vue-cli 安装失败Failed to download repo vuejs-templates/vuedemo: Response code 404 (Not Found)

    还原问题现场: 第一次使用vue init webpack projectName的时候,由于操作失误,执行了两次npm install -g vue-cli,然后再使用vue init webpac ...

  9. Spring源码分析(六)解析和注册BeanDefinitions

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 当把文件转换为Document后,接下来的提取及注册bean就是我们的重 ...

  10. 克隆虚拟机及配置yum源的步骤及讲解(Hadoop基础)

    1.克隆虚拟机 找一台需要克隆的虚拟机但虚拟机必须在关机下进行,(建议将前期Linux环境 配置完成) 在VMware中右键虚拟机找到克隆的选项.   点击克隆 可以克隆他的快照(提前做快照)或者是克 ...