Linux三剑客-AWK
1、什么是awk
AWK是一种处理文本文件的语言,是一个强大的文本分析工具。有统计和计算功能。
之所以叫AWK是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。
参数说明
选项参数说明:
-F fs or --field-separator fs
指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。
-v var=value or --asign var=value
赋值一个用户定义变量。
-f scripfile or --file scriptfile
从脚本文件中读取awk命令。
-mf nnn and -mr nnn
对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。
-W compact or --compat, -W traditional or --traditional
在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。
-W copyleft or --copyleft, -W copyright or --copyright
打印简短的版权信息。
-W help or --help, -W usage or --usage
打印全部awk选项和每个选项的简短说明。
-W lint or --lint
打印不能向传统unix平台移植的结构的警告。
-W lint-old or --lint-old
打印关于不能向传统unix平台移植的结构的警告。
-W posix
打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。
-W re-interval or --re-inerval
允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。
-W source program-text or --source program-text
使用program-text作为源代码,可与-f命令混用。
-W version or --version
打印bug报告信息的版本。
2、awk的执行流程
其执行过程和sed相似,在我们遇到复杂的语句时,可以离利用执行过程来理解
题目:passwd文件的第二行的第一列和第二列
[root@luffy-001 oldboy]# awk -F ':' 'NR==2{print $1,$2}' /etc/passwd
bin x
awk 参数 ‘模式{动作}’ 文件
awk 参数 ‘条件(找谁){干啥}’ 文件
awk执行过程简图

3、模式匹配:模式与动作
怎么找到这一行,然后做点什么
通过正则表达式作为模式
创建测试环境
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的行
[root@luffy-001 files]# sed -n '/1/p' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
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@luffy-001 files]# awk '/1/' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
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
awk支持的正则表达式
|
题目:显示xiaoyu的姓氏和ID号码
[root@luffy-001 files]# awk '/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@luffy-001 files]# awk '/Xiaoyu/{print $1,$2,$3}' reg.txt 相当于$0~,$0 在awk中表示这一行,整行记录
Zhang Xiaoyu 390320151
[root@luffy-001 files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt 波浪线表示包含,第二列包含xiaoyu的行 的第一列,第二列,第三列
Zhang Xiaoyu 390320151
题目:显示所有以41开头的ID号码的人的全名和ID号码
[root@luffy-001 files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
题目:显示所有ID号码最后一位数字是1或5的人的全名
[root@luffy-001 files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
[root@luffy-001 files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
题目:显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
gsub的用法:
gsub(/目标/,"替换为什么",第几列)
gsub(/目标/,"替换为什么") == gsub(/目标/,"替换为什么",$0)
[root@luffy-001 files]# sed 's#:#$#g' 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@luffy-001 files]# awk '{gsub(/:/,'$',$4);print}' reg.txt
awk: {gsub(/:/,,$4);print}
awk: ^ syntax error
awk: fatal: 0 is invalid as number of arguments for gsub
[root@luffy-001 files]# awk '{gsub(/:/,"$",$4);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
题目答案:
[root@luffy-001 files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print}' reg.txt
Zhang Xiaoyu 390320151 $155$90$201
特殊模式:BEGIN 和END
BEGIN{} BEGIN里面的内容,会在awk读取文件内容之前运行。
测试,计算。
END{}*** END{}里面的内容,会在awk读取完文件的最后一行之后运行。
用来显示最终结果。
先计算,END显示结果。
[root@luffy-001 files]# awk 'BEGIN{print "this is kt"} {print NR,$0}' reg.txt
this is kt
1 Zhang Dandan 41117397 :250:100:175
2 Zhang Xiaoyu 390320151 :155:90:201
3 Meng Feixue 80042789 :250:60:50
4 Wu Waiwai 70271111 :250:80:75
5 Liu Bingbing 41117483 :250:100:175
6 Wang Xiaoai 3515064655 :50:95:135
7 Zi Gege 1986787350 :250:168:200
8 Li Youjiu 918391635 :175:75:300
9 Lao Nanhai 918391635 :250:100:175
[root@luffy-001 files]# awk 'BEGIN{print "this is kt"} END{print "this is kb"} {print NR,$0}' reg.txt
this is kt
1 Zhang Dandan 41117397 :250:100:175
2 Zhang Xiaoyu 390320151 :155:90:201
3 Meng Feixue 80042789 :250:60:50
4 Wu Waiwai 70271111 :250:80:75
5 Liu Bingbing 41117483 :250:100:175
6 Wang Xiaoai 3515064655 :50:95:135
7 Zi Gege 1986787350 :250:168:200
8 Li Youjiu 918391635 :175:75:300
9 Lao Nanhai 918391635 :250:100:175
this is kb
题目:统计/etc/services文件里面的空行数量
[root@luffy-001 files]# awk '/^$/{print NR}' /etc/services
22
266
299
320
326
393
461
474
479
486
494
506
512
518
583
584
[root@luffy-001 files]# awk '/^$/{i=i+1;print i}' /etc/services
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@luffy-001 files]# awk '/^$/{i=i+1} END{print i}' /etc/services
16
统计出现多少次 计数
i=i+1 ===> i++
常见用法
##用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' 只能用单引号
##用法二:
awk -F #-F相当于内置变量FS, 指定分割字符
##用法三:
awk -v # 设置变量
##用法四:
awk -f {awk脚本} {文件名}
4、awk数组:统计与计算
数组怎么使用?

举个例子:
[root@luffy-001 files]# awk 'BEGIN{h[110]="张三";h[114]="XXOO";print h[110],h[114]}'
张三 XXOO
运算符
运算符 描述
= += -= *= /= %= ^= **= 赋值
?: C条件表达式
|| 逻辑或
&& 逻辑与
~ ~! 匹配正则表达式和不匹配正则表达式
< <= > >= != == 关系运算符
空格 连接
+ - 加,减
* / % 乘,除与求余
+ - ! 一元加,减和逻辑非
^ *** 求幂
++ -- 增加或减少,作为前缀或后缀
$ 字段引用
in 数组成员
题目:处理以下文件内容,将域名取出并根据域名进行计数排序处理:(百度和sohu面试题)
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@luffy-001 files]# awk -F '[/.]+' '{print $2}' url.txt
www
www
post
mp3
www
post
## 使用h[$2]建立数组,并自加,打印出其中一个
[root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++;print h["www"]}' url.txt
1
2
2
2
3
3
## 答应所有的结果,只是当种类多了之后,没法操作
[root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++} END{print h["www"],h["post"],h["mp3"]}' url.txt
3 2 1
## awk独有的循环的功能
[root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++} END{for(pol in h) print pol,h[pol]}' url.txt
www 3
mp3 1
post 2
题目:统计access.log文件中每个ip地址出现的次数
题目:secure系统日志分析练习
谁在破解你的密码(Failed password 每个ip地址出现的次数)
分析系统的每个用户被破解的次数
## 统计IP登录次数
[root@luffy-001 log]# awk '$0~/Accepted/{h[$11]++}END{for(por in h) print por,h[por]}' secure
10.0.0.1 3
## 统计每个用户被破解的次数
[root@luffy-001 log]# awk '$0~/FAILED LOGIN/{h[$12]++}END{for(por in h) print por,h[por]}' secure
rot, 1
## 统计谁在破解你的密码(Failed password 每个ip地址出现的次数)
[root@luffy-001 log]# awk -F "[()]" '/FAILED/{h[$2]++}END{for(pol in h) print pol, h[pol]}' secure
null 1
Linux三剑客-AWK的更多相关文章
- 性能工具之linux三剑客awk、grep、sed详解
前言 linux 有很多工具可以做文本处理,例如:sort, cut, split, join, paste, comm, uniq, column, rev, tac, tr, nl, pr, he ...
- Linux三剑客awk
Linux三剑客awk awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式 awk早期在Unix上实现,我们用的awk是gawk,是GUN ...
- Linux 三剑客 -- awk sed grep
本文由本人收集整理自互联网供自己与网友参考,参考文章均已列出,如有侵权,请告知! 顶配awk,中配sed,标配grep awk 参考 sed 参考 grep 参考 在线查看linux命令速记表 app ...
- Linux实战教学笔记18:linux三剑客之awk精讲
Linux三剑客之awk精讲(基础与进阶) 标签(空格分隔): Linux实战教学笔记-陈思齐 快捷跳转目录: * 第1章:awk基础入门 * 1.1:awk简介 * 1.2:学完awk你可以掌握: ...
- (转)不看绝对后悔的Linux三剑客之awk实战精讲
原文:http://blog.51cto.com/hujiangtao/1923930 一.Linux三剑客之awk命令精讲 第1章 awk基础入门 1.1 awk简介 awk不仅仅时linux系统中 ...
- Linux(8):linux三剑客sed和awk & Shell 编程(1)
linux 三剑客 之 sed # sed 是什么? # sed : 字符流编辑器 Stream Editor: sed 擅长 替换.取行等 # sed 的功能与版本: 处理纯文本文件.日志.配置文件 ...
- Linux三剑客grep、awk、sed
何为Linux三剑客? 第一个剑客是 grep,grep 会根据正则表达式查找相关内容并打印对应的数据. 第二个剑客是 awk,awk 的名字来源于三个作者的名字简称,它可以根据定位到的数据行处理其中 ...
- Linux三剑客grep、awk和sed
grep,sed 和 awk是Linux/Unix 系统中常用的三个文本处理的命令行工具,称为文本处理三剑客.本文将简要介绍这三个命令并给出基本用法. 管道 在介绍这两个命令之前,有必要介绍一下Uni ...
- Linux 三剑客之 awk 实战详解教程
我们知道 Linux 三剑客,它们分别是:grep.sed.awk.在前边已经讲过 grep 和 sed,没看过的同学可以直接点击阅读,今天要分享的是更为强大的 awk. sed 可以实现非交互式的字 ...
随机推荐
- ASP.NET MVC3 在_ViewStart设置Layout使用RenderAction的注意事項
来源:https://dotblogs.com.tw/lastsecret/archive/2012/03/26/71052.aspx ASP.NET MVC3 在_ViewStart設定Layout ...
- Java java jdbc thin远程连接并操作Oracle数据库
JAVA jdbc thin远程连接并操作Oracle数据库 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 编码工具:Eclipse 编码平台:W ...
- Could not open input file: artisan 【Laravel初体验】
1,情景描述:在命令行窗口写入php artisan make:model Models\MenuModel用于创建模型时,出现此错误(Could not open input file: artis ...
- JS中数组重排序方法
在数组中有两个可以用来直接排序的方法,分别是reverse()和sort().下面通过本文给大家详细介绍,对js数组重排序相关知识感兴趣的朋友一起看看吧 1.数组中已存在两个可直接用来重排序的方法:r ...
- JavaScript 基础(二) - 创建 function 对象的方法, String对象, Array对象
创建 function 对象的两种方法: 方式一(推荐) function func1(){ alert(123); return 8 } var ret = func1() alert(ret) 方 ...
- CSS效果:CSS3实现模拟select以及其中的三角形
如图实现这样的效果: html代码如下: <div class="select-bg"> <select class="select-green&quo ...
- 洛谷P4462 [CQOI2018]异或序列(莫队)
题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...
- 2018-08-29 浏览器插件实现GitHub代码翻译原型演示
此原型源自此想法: 中文化源码. 考虑到IDE插件工作量较大, 且与IDE绑定. 在代码转换工具的各种实现中, 综合考虑实用+易用+长远改进潜力, 浏览器插件似乎较有优势. 于是用最快捷的方式实现这一 ...
- 使用Gson将对象类转成Json对象时出现\u003d的问题
Gson将对象转成Json对象的方法 Gson gson=new Gson(); String json=gson.toJson(Student.class); 这种情况,如果Student属性中的某 ...
- 【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件
DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行 ...