Linux之awk详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之awk详解相关的知识,希望对你有一定的参考价值。

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在对数据分析并生成报告时,显得尤为强大。
简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
awk有三个不同的版本:awk、nawk和gawk,未作特别说明,一般指gawk,gawk是awk的GNU版本。
之所以叫awk是因为其取了三位创始人Alfred Aho,Peter Weinberger,和Brian Kernighan的Family Name的首字符。
awk格式:
格式: sed -n '3p' sed.txt
找谁干啥(条件动作)
awk格式
#取出/etc/passwd 第1行的第1列和第3列
awk -F: 'NR==1print $1.$3' /etc/passwd
awk 选项 '条件动作' /etc/passwd
条件: 哪一行,过滤什么内容
动作: print输出与显示 ,计算....
awk取行:与sed类似
案例01:取出sed.txt的第2行
[root@oldboy81-golden-lnb /oldboy]# cat sed.txt
101.oldgirl,CEO
102.zhangya,CTO
103.lidao007.COO
104.yy,CFO
105.feixue,CIO
110.lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk 'NR==2' sed.txt
102.zhangya,CTO
#awk '行号 等于 2' sed.txt
#NR awk内置变量
Number of Record 记录号(行号)
案例02:取出sed.txt中包含oldboy或lidao的行
[root@oldboy81-golden-lnb /oldboy]# sed -rn '/oldboy|lidao/p' sed.txt
103.lidao007.COO
110.lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# awk '/oldboy|lidao/' sed.txt
103.lidao007.COO
110.lidao,COCO
案例03:取出文件第2行到第5行内容
#awk '行号大于等于2 并且 行号小于等于5' sed.txt
#方法01
awk 'NR>=2 && NR<=5' sed.txt #必会
&& 表示并且.
#方法02
sed -n '2.5p' sed.txt
#方法03 了解
awk 'NR==2.NR==5' sed.txt #从行号是2的行开始 到 行号是5的行结束( 了解)
案例04:取出文件第3行到最后一行内容
[root@oldboy81-golden-lnb /oldboy]# awk 'NR >= 3' sed.txt
103.lidao007.COO
104.yy,CFO
105.feixue,CIO
110.lidao,COCO
[root@oldboy81-golden-lnb /oldboy]# sed -n '3.$p' sed.txt
103.lidao007.COO
104.yy,CFO
105.feixue,CIO
110.lidao,COCO
案例05:取出从包含oldboy的行到lidao的行
[root@oldboy81-golden-lnb /oldboy]# cat sed.txt
101.oldgirl,CEO
102.zhangya,CTO
103.lidao007.COO
104.yy,CFO
105.feixue,CIO
110.lidao,COCO
root@oldboy81-golden-lnb /oldboy]# sed -n '/old/,/lidao/p' sed.txt
101.oldgirl,CEO
102.zhangya,CTO
103.lidao007.COO
[root@oldboy81-golden-lnb /oldboy]# awk '/old/ , /lidao/' sed.txt
101.oldgirl,CEO
102.zhangya,CTO
103.lidao007.COO
参考技术A '#Gun awk的相关用法

一次读取一行文本,按输入分隔符进行切片,切成多个组成部分,将每片直接保存在内建的变量中,$1,$2,$3....,引用指定的变量,可以显示指定断,或者多个断。如果需要显示全部的,需要使用$0来引用。可以对单个片断进行判断,也可以对所有断进行循环判断。其默认分隔符为空格

9.gawk应用实现

(1)内建变量;
1)字段和数据行分隔符变量

(2)自定义变量
1)在脚本中给变量赋值

(3)处理数组

(4)使用模式

(5)结构化命令
1)if语句
格式:
if (condition)
statement1

if (condition) statement1

(6)格式化打印
注意到print语句在gawk如何显示数据上并未提供多少控制。你能做的大概只是控制输出字段分隔符(OFS)。

(7)自定义函数
1)定义函数
要定义自己的函数,你必须使用function关键字:
function name([variables])

statements

1.12-linux三剑客之awk用法详解

1.12

linux三剑客之awk用法详解

内容:

1. awk执行过程

2. awk命令格式

3. awk用法

4. awk数组

第1章 awk执行过程

技术分享图片 

一直读取到文件的最后一行

第2章 awk 找谁{干啥}

                模式{动作}

模式 pattern   动作  action

第3章 awk中什么可以作为模式

正则表达式

比较表达式    NR>10

范围模式

特殊模式BEGIN{}END{}

 

awk支持正则中的特殊符号

3.1 正则表达式

测试文件/server/files/reg.txt

[[email protected] files]# cat 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

 

练习:找出第三列包含连续数字0

 awk '$3  ~/0+/' reg.txt

Zhang Xiaoyu    390320151  :155:90:201

Meng  Feixue    80042789   :250:60:50

Wu    Waiwai    70271111   :250:80:75

Wang  Xiaoai    3515064655 :50:95:135

~ 匹配  包含

!~ 不匹配  不包含

 

实例3-1 显示Xiaoyu的姓氏和ID

条件:第二列中包含Xiaoyu

动作:显示哪一列

[[email protected] files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

Zhang 390320151

比较:/Xiaoyu/$2~/Xiaoyu/区别

[[email protected] files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt

Zhang 390320151

/Xiaoyu/$2~/Xiaoyu/区别

/Xiaoyu/表示这一行中有Xiaoyu  ===$0~/Xiaoyu/

$2~/Xiaoyu/ 表示第2列中有Xiaoyu

 

实例3-2 找出姓Zhang的人第二次捐款及其姓氏

[[email protected] files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$5}' reg.txt

Zhang 100

Zhang 90

逆向思维   --倒数第几行

[[email protected] files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$(NF-1)}' reg.txt

Zhang 100

Zhang 90

实例3-3 显示所有以41开头的ID号码的人的全名和ID号码

[[email protected] files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt

Zhang Dandan 41117397

Liu Bingbing 41117483

实例3-4 显示所有ID号码最后一位数字是15的人的全名

[[email protected] files]# awk '$3~/[15]$/{print $1,$2}' reg.txt

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai

3.1.1 显示Xiaoyu的捐款,每个值时都有以$开头,$520$200$135 

 awk怎么替换---awk{gsub}

[[email protected] files]# awk '$2 ~ /Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt

$155$90$201

gsub函数  格式/用法

{grup(/你要找什么/,替换成什么,在第几列)}   

grup(/你要找什么/,替换成什么)=====grup(/你要找什么/,替换成什么,$0)  默认找整行

3.2 特殊模式  BEGIN{}END{}

3.2.1 BEGIN{}   里面的内容会在awk读取文件之前执行

                   awk里面的内置变量

[[email protected] ~]# awk 'BEGIN{print "this is beginning"}{print $0}' /server/files/reg.txt    

this is beginning         awk读取文件之前运行

Zhang Dandan    41117397   :250:100:175

Zhang Xiaoyu    390320151  :155:90:201

Meng  Feixue    80042789   :250:60:50

BEGIN{}:常用来测试 计算  修改 awk内置变量

3.2.2 END{}  END{} 里面的内容会在awk读取完文件内容之后运行

                先计算,END输出最终结果

[[email protected] ~]# awk '{print $0}END{print "end of file"}' /server/files/reg.txt

Zhang Dandan    41117397   :250:100:175

Zhang Xiaoyu    390320151  :155:90:201

end of file              awk读取完文件内容之后运行

作用:显示计算的最终结果

 

3.2.3 awk内置变量

FS

-F  ==修改FS内置变量(filed separator)

-F: ==BEGIN{FS=:} ===-vFS=:

  -v 指定变量    linuxawk的桥梁

NR  行号

                                        NR  NF  别改变量

NF  number of field 每一行有多少列

实例3-1 统计/etc/services文件中空行数量

[[email protected] files]# egrep '^$' /etc/services |wc -l

16

 

[[email protected] files]# grep -c '^$' /etc/services

16                               -c   统计行数

 

 

 

i=i+1  === i++ 统计次数  每次加一  计数

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

awk '/^$/{i++;print i}' /etc/services

1   

2                    awk 中使用变量  直接写 直接用   不需要$

...

15

16

前面先计算  END显示最终结果

[[email protected] files]# awk '/^$/{i++}END{print i}' /etc/services

16

实例3-2 统计/etc/passwd中有多少个虚拟用户

[[email protected] files]# awk -F '[:]' '$NF~/nologin/{i++}END{print i}' /etc/passwd

20

实例3-3 计算 seq 10             i=i+$0     计算总和 累加

[[email protected] files]# seq 10|awk '{sum=sum+$0}END{print sum}'

55                      

第4章 awk完整执行过程

以行为单位执行

技术分享图片 

第5章 awk数组

5.1 awk数组的组成

数组的名字[元素]=元素内容   

统计谁  中括号里写谁

技术分享图片 

 

测试用BENGIN{}

[[email protected] ~]# awk 'BEGIN{h[110]="UFO";h[114]="haha";print h[110],h[114]}'

UFO haha

实例5-1 处理以下文件内容,将域名取出并根据域名进行计数排序处理

[[email protected] files]# cat /server/files/url.txt

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

数组应用

[[email protected] files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' url.txt 
3 2 1

简便

[[email protected] files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h  ) print pol}' url.txt 
www
mp3
post
[[email protected] files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h  ) print pol,h[pol]}' url.txt 
www  3          pol(变量-包工头)-代表三个变量 www  mp3  post    
mp3  1          h[pol]变量的内容
post 2         

单独取某一变量内容

[[email protected] files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["www"]}' url.txt

3               思想:awk工作以行为单位

3

3

[[email protected] files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["post"]}' url.txt

2

2

2

数组工作过程/原理

[[email protected] files]# awk -F "[/.]+" '{h[$2]++;print $2,h["www"]}' url.txt|column -t                         元素              统计www

www   1            符合 h[$2]=0+1=1

www   2            符合 h[$2]=1+1=2

post  2            不符合

mp3   2            不符合

www   3            符合  h[$2]=2+1=3

post  3            不符合

文件环境/oldboy/awklx/secure

[[email protected] files]# tail /oldboy/awklx/secure-20161219

Dec 19 03:41:56 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2

Dec 19 03:41:57 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2

Dec 19 03:41:57 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2

实例5-2 统计谁在破解你的密码 --重点  

[[email protected] files]# awk '/Failed/{h[$(NF-3)]++}END{for(gao in h)print gao,h[gao]}' /oldboy/awklx/secure-20161219|column -t|sort -rnk2

218.65.30.25     68652   h[$(NF-3)]  酒店--元素[倒数第四列]

218.65.30.53     34326   END{for(gao in h)   循环

218.87.109.154   21201   print gao,h[gao]}   显示变量内容,显示房间内容

112.85.42.103    18065   column -t   每列对齐

112.85.42.99     17164   sort -rnk2 排序 倒序 把内容当做数字 指定按列

 

实例5-3 统计哪个用户被破解的次数最多

[[email protected] awklx]# awk '/Failed/{h[$(NF-5)]++}END{for(pol in h)print pol,h[pol]}' secure-20161219|grep 'root'

root 364610

 


以上是关于Linux之awk详解的主要内容,如果未能解决你的问题,请参考以下文章

linux 之awk命令详解

Linux 之 awk 实例详解

Linux三剑客之awk命令详解

linux基础学习第二十二天之AWK详解

Linux上文本三剑客之awk详解

[Linux教程]Linux 三剑客之 awk 实战详解