Linux三剑客之awk最佳实践

笔者Q:972581034 交流群:605799367。有任何疑问可与笔者或加群交流

知识点:

  • 记录与字段
  • 模式匹配:模式与动作
  • 基本的awk执行过程
  • awk常用内置变量(预定义变量)
  • awk数组
  • awk语法:循环、条件
  • awk常用函数
  • 向awk传递参数
  • awk引用shell变量
  • awk小程序及调试思路

    [root@ctg ~]# awk --version|head -1
    GNU Awk 3.1.7

第1章 记录和字段

record记录==行, field字段相当于列,字段==列。
awk对每个要处理的输入数据认为都是具有格式和结构的,而不仅仅是一堆字符串。默认情况下,每一行内容都是一条记录,并以换行符分隔(\n)结束

1.1记录分隔符-RS

awk默认情况下每一行都是一个记录(record)

RS即 record separator输入数据记录分隔符,每一行是怎么没的,表示每个记录输入的时候的分隔符,即行与行之间如何分隔。
NR即number of record记录(行)号,表示当前正在处理的记录(行)的号码
ORS即output record separator输出记录分隔符

awk使用内置变量RS来存放输入记录分隔符,RS表示的是输入的记录分隔符,这个值可以通过BEGIN模块重新定义修改。

小结:

gawk
RS=行分隔符(记录分隔符)
ORS=输出记录分隔符
FS=字段分隔符(列分隔符)
OFS=输出字段分隔符
$0=整个记录
NF= 列数
NR= 行数
在{print ,}中,逗号的意思是OFS
BEGIN:主要用来定义内置变量.

1.2 对$0的认识

awk$0表示整行,其实awk使用$0来表示整条记录。记录分隔符

1.3 企业面试题

统计下面文件里单词出现的次数并排序
由sed -r 's#[^a-Z]+# #g' /etc/passwd > /root/tongji.txt 创建
解答:

awk 'BEGIN{RS="[^a-zA-Z]"}{print $0}' tongji.txt |sort |uniq -c|sort -rn

1.4 awk记录知识小结:

  1. NR(number of record)存放着每个记录的号(行号)读取新行时候会自动+1
  2. RS(record separator)是输入数据的记录的分隔符,简单理解就是可以指定每个记录的结尾标志
  3. RS作用就是表示一个记录的结束
  4. 当我们修改了RS的值,最好配合NR(行)来查看变批,也就是修改了RS的值通过NR查看结果,调试awk程序
  5. ORS输出数据的记录的分隔符

1.5 字段(列)

FS即field separator,输入字段(列)分隔符。分隔符就是菜刀,把一行字符串切为很多个区域
NF即 number of fileds,表示一行中列(字段)的个数,可以理解为菜刀切过一行后,切成了多少份
OFS输出字段(列)分隔符
awk使用内置变量FS来记录区域分隔符的内容,FS可以在命令行上通过-F参数来更改,也可以通过BEGIN模块来更改
然后通过$n,n是整数,来取被切割后的区域,
3.6 ORS与OFS简介
RS是输入记录分隔符,决定awk如何读取或分割每行(记录)
ORS表示输出记录分隔符,决定awk如何读取或分割每行(记录)
FS是输入区域分隔符,决定awk输出每个区域的时候使用什么分割他们。
awk无比强大,你可以通过RS,FS决定awk如何读取数据。你也可以通过修改ORS,OFS的值指定awk如何输出数据。
{print ,}这里面的逗号等于OFS的值

RS=行分隔符(记录分隔符)
ORS=输出记录分隔符
FS=字段分隔符(列分隔符)
OFS=输出字段分隔符(OFS的值等于逗号)
$0=整个记录
----------

3.7 题目
按单词出现频率降序排序

[root@ctg files]# cat count.txt 
root x root root bin bash
bin x bin bin sbin nologin
daemon x daemon sbin sbin nologin
adm x adm var adm sbin nologin
lp x lp var spool lpd sbin nologin
sync x sync sbin bin sync
shutdown x shutdown sbin sbin shutdown
halt x halt sbin sbin halt
mail x mail var spool mail sbin nologin
uucp x uucp var spool uucp sbin nologin

解答:

sed 's# #\n#g' count_word.txt|sort |uniq -c 
tr " " "\n" < count_word.txt|sort |uniq -c 
awk 'BEGIN{RS=" "}{print $0}' count_word.txt|sort |uniq -c 
egrep -o "[a-z]+" count_word.txt|sort |uniq -c 
xargs -n1 <awk_blank.txt|sort |uniq -c 
awk 'BEGIN{RS=" "}{print $0}' awk_blank.txt|sort |uniq -c 
egrep -o "[a-zA-Z0-9]+" awk_blank.txt|sort |uniq -c

第2章 awk进阶
2.1 awk的模式
 正则表达式作为模式
 比较表达式作为模式
 范围模式
 特殊模式BEGIN和END
awk的模式是你玩好awk的必备也是最基础的内容,必须熟练掌握
2.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

显示姓Zhang的人的第二次捐款金额及她的名字

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

显示Xiaoyu的姓氏和ID号码

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

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

[root@oldboy34-niubility files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt 
Zhang Dandan 41117397
Liu Bingbing 41117483

显示所有以一个D或X开头的人名全名

[root@oldboy34-niubility files]# awk '$2~/^[DX]/{print $1,$2}' reg.txt 
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai

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

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

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

[root@ctg files]# awk '/Xiaoyu/{print $NF}' reg.txt |tr ":" "$"
$155$90$201
[root@ctg files]# awk -F "[ :]+" 'BEGIN{OFS="$"}/Xiaoyu/{print  "",$4,$5,$6}' reg.txt 
$155$90$201
awk '{gsub(/:/,"$");print $NF}' reg.txt

显示所有人的全名,以姓,名的格式显示,如Meng,Feixue

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

取出下面不是oldboy的行 (匹配结果需包含oldboy linux )

cat >>/server/files/zhuanyedian.txt <<EOF
lidao
oldboy
oldboylinux
zhangdao
xiadao
EOF
[root@oldboy34-niubility files]# awk '$0!~/oldboy$/' zhuanyedian.txt
lidao
oldboylinux
zhangdao
xiadao

2.2 gsub替换函数

[root@ctg test]# cat reg.txt 
Zhang Dandan    41117397     :250:100:175
Zhang Xiaoyu    390330151    :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    918381635    :175:75:300
Lao   Nanhai    918391635    :250:100:175
[root@ctg test]# awk '{gsub(/:/,"$");print $NF}' reg.txt 
$250$100$175
$155$90$201
$250$60$50
$250$80$75
$250$100$175
$50$95$135
$250$168$200
$175$75$300
$250$100$175
[root@oldboy34-niubility files]# #sed 's###g'
[root@oldboy34-niubility files]# #gsub awk中 进行查找替换 功能 命令 函数
[root@oldboy34-niubility files]# #gsub(/正则表达式/,"替换成什么")  #把一行内 
[root@oldboy34-niubility files]# #gsub(/正则表达式/,"替换成什么",$2) #把$2第二列里面的 内容替换成xxx
[root@oldboy34-niubility files]# 
[root@oldboy34-niubility files]# echo oldboy linux |awk '{gsub(/oldboy/,"oldgirl")}'
[root@oldboy34-niubility files]# echo oldboy linux |awk '{gsub(/oldboy/,"oldgirl");print }'
oldgirl linux
[root@oldboy34-niubility files]# cat 
awkfile.txt      count.txt        oldboy.txt       reg.txt          zhuanyedian.txt  
[root@oldboy34-niubility 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
[root@oldboy34-niubility files]# awk '{gsub(/:/,"$",$NF);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@oldboy34-niubility files]# awk '{gsub(/:/,"$",$NF);print }' reg.txt |column -t
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@ctg files]# awk '{gsub(/[a-zA-Z]/,"*");print}' reg.txt 
***** ******    41117397   :250:100:175
***** ******    390320151  :155:90:201
****  ******    80042789   :250:60:50
**    ******    70271111   :250:80:75
***   ********  41117483   :250:100:175
****  ******    3515064655 :50:95:135
**    ****      1986787350 :250:168:200
**    ******    918391635  :175:75:300
***   ******    918391635  :250:100:175
[root@ctg files]# awk '{gsub(/[a-zA-Z]/,"*",$1);print}' reg.txt 
***** Dandan 41117397 :250:100:175
***** Xiaoyu 390320151 :155:90:201
**** Feixue 80042789 :250:60:50
** Waiwai 70271111 :250:80:75
*** Bingbing 41117483 :250:100:175
**** Xiaoai 3515064655 :50:95:135
** Gege 1986787350 :250:168:200
** Youjiu 918391635 :175:75:300
*** Nanhai 918391635 :250:100:175

2.3 比较表达式作为模式

之前我们看了正则表达式在awk下的运用,下面再具体看看比较表达式如何在awk下工作。
awk是一种编程语言,能够进行更为复杂的判断,当条件为真的时候,awk就执行相关的action。主要是在针对某一区域做出相关的判断,比如打印成绩在80分以上的行,这样就必须对这一个区域做比较判断,下表中列出了awk可以使用的关系运算符,可以用来比较数字或者字符串,还有正则表达式。当表达式为真时,表达式结果为1,否则为0,只有表达式为真,awk才执行相关的action
|运算符 含义 示例

< 小于 x>y
<= 小于等于 x<=y
== 等于 x==y
!= 不等于 x!=y
>= 大与或等于 x>=y
> 大于 x<y
以上的运算符均是针对数字,下面两个运算符针对字符串
~ 与正则表达式匹配 x~/y/
!~ 与正则表达式不匹配 x!~y

2.4 说明

awk在输出整行既$0的时候,仅仅是原封不动的输出整行,没有任何修改。这就造成一个问题,如果我修改了OFS,那么输出整行的时候print $0的时候,也不会有任何改变。即:如果awk的action动作没有更改行的内容,OFS(包括ORS)都不会生效。
所以我们需要让awk知道$0被修改了,这一个事情。
$1=$1是把$1的值赋值给$1,这显然不会修改任何内容,但是这个动作会通知awk我修改了$1的内容,所以再次修改print $0的时候,$0的内容就变化了。
这是一个小技巧

2.5 awk特殊模式-BEGIN模式与END模式
2.5.1 BEGIN模块

BEGIN模块在awk读取文件之前就执行,一般用来定义我们的内置变量(预定义变量,eg:FS, RS),可以输出表头(类似excel表格名称)
BEGIN模式之前我们有在示例中提到,自定义变量,给内容变量赋值等,都使用过。需要注意的是BEGIN模式后面要接跟一个action操作块,包含在大括号内。awk必须在对输入文件进行任何处理前先执行BEGIN里的动作(action)。我们可以不要任何输入文件,就可以对BEGIN模块进行测试,因为awk需要先执行完BEGIN模式,才对输入文件做处理.BEGIN模式常常被用来修改内置变量ORS,RS,FS,OFS等的值.

[root@ctg ~]# awk 'BEGIN{FS=":";print "username","UID","password"}NR==1{print $1,$2,$3}' /etc/passwd|column -t
username  UID  password
root      x    0
2.5.2 awk中变量的概念简介

 直接定义,直接使用即可
 awk中字母会被认为是变量,如果真的要给一个变量赋值字母(字符串),请使用双引号。

2.6.3 END模式

END在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果),也可以是和BEGIN模块类似的结尾标识信息。

[root@ctg test]# awk 'BEGIN{print "hello world"}{print NR,$0}END{print "end of file"}' reg.txt 
hello world
1 Zhang Dandan    41117397     :250:100:175
2 Zhang Xiaoyu    390330151    :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    918381635    :175:75:300
9 Lao   Nanhai    918391635    :250:100:175
end of file

与BEGIN模式相对应的END模式,格式一样,但是END模式仅在awk处理完所有输入行后才进行处理。

3.1 awk中的动作

 在一个模式-动作语句中,模式决定动作什么时候执行,有时候动作会非常简单:一条单独的打印或赋值语句,在有些时候,动作有可能是多条语句,语句之间用换行符或分号分开。
 awk的动作中如果有两个或两个以上的语句,需要用分号分隔。
 动作部分理解为花括号里面的内容即可,总体分为:

 表达式
 流程控制语句
 空语句
 数组

4.1 计算从一加到100

[root@ctg ~]# awk '{i+=$1;print i-$1"+"$1"="i}' count.txt 
0+1=1
1+2=3
3+3=6
6+4=10
10+5=15
15+6=21
21+7=28
28+8=36
36+9=45
45+10=55

4.2 awk模式与动作小结:

 awk命令核心由模式和动作组成,就是找谁{干啥}
 模式就是条件,动作就是具体干什么
 正则表达式:必须掌握正则,熟练
 条件表达式:比大小,比较是否相等
 范围表达式:从哪里来到哪里支
 注意BEGIN或END模块只能有一个。BEGIN{}BEGIN或者END{}END都是错误的。
 找谁干啥模块,可以是多个。
'NR==2{print $1}NR==5{print $0}'
awk -F ":" 'NR==1{print NR,$0}NR==2{print NR,$NF}' awkfile.txt

4.3 awk执行过程

A. 命令行的赋值(-F或-v)

B. 执行BEGIN模式里面的内容

C. 开始读取文件

D. 判断条件(模式)是否成立
成立则执行对应动作里面的内容
读取下一行,循环判断
真到读取到最后一个文件的结尾
E.最后执行END模式里面的内容
F.结束
思想:

  1. awk核心思想就是先处理,然后END模块输出。(累加(a++;a+=$0),awk数组)
  2. BEGIN模块用于awk内置变量FS,RS的赋值,打印标题头的信息。(excel表格里面标题行)
    要在awk执行前,定义好。
  3. END模块用来最后输出,统计信息,awk数组信息,(累加(a++;a+=$0),awk数组)
  4. 字段(列),记录(行)
    4.4 调试工具
[root@oldboy34-niubility files]# pgawk 'BEGIN{print "i=i+$1"}NR==1{i+=$1;print i-$1"+"$1"="i}' count_lei.txt |head
i=i+$1
0+1=1
[root@oldboy34-niubility files]# cat awkprof.out 
# gawk profile, created Wed Mar  1 17:21:06 2017

# BEGIN block(s)

BEGIN {
     1   print "i=i+$1"
}

# Rule(s)

   100  NR == 1 { # 1
     1   i += $1
     1   print ((i - $1) "+" ($1) "=" i)
}

4.5 awk数组

警察查房,for(pol in hotel) 查完后pol知道了房间号码,并知道了里面的内容,

[root@ctg ~]# awk 'BEGIN{hotel[110]="xiaoyu";hotel[119]="tandao";hotel[121]="feixue";for(pol in hotel){print pol,hotel[pol]}}'
110 xiaoyu
121 feixue
119 tandao
小结:

awk数组是分析日志最常用的功能,也是玩转awk必会的部分。

1.awk数组的名字就像酒店的名字一样
2.awk数组的元素名字就像房间号码,房间号码用的一般就是你想要处理的东西,比如统计ip地址,比如统计url。可以把ip,url作为房间号码。
3.awk数组的元素的内容就像房间里面住的人,一般就是放的我们想要的结果,或者计算的结果。即把计算结果放在房间中。
4.遇到awk数组的处理一般都是进行统计,这时候我们会把最后的结果在END模块里面输出。
5.输出显示awk数组的结果,就是显示房间里面的内容,即查房。
6.awk的查房是通过for(pol in hotel)这种形式来完成的。for表示循环,pol表示警察是一个变量名字,in表示去查房,hotel表示酒店名称,合起来就是警察去酒店查房,查完一个继续查下一个。
7.在查房过程中pol警察知道房间号码,也就是说pol变量中的内容是房间号码。
8.要看房间中的内容,首先要知道酒店名称,然后就是房间号码即,hotel[pol]
9.要熟练使用awk数组在开始的时候就要学会一步一步看awk如何执行的即可。
4.6 企业面试题1

[root@ctg test]# cat www.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
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print i}' www.txt 
mp3.etiantian.org
post.etiantian.org
www.etiantian.org
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print a[i]}' www.txt 
1
2
3
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print a[i],i}' www.txt 
1 mp3.etiantian.org
2 post.etiantian.org
3 www.etiantian.org
[root@ctg test]# awk -F/ '{a[$3]++}END{for(i in a)print i,a[i]}' www.txt 
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3

4.7 企业面试题2

考试题3.分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,取top10,也就是计算每个url的总访问大小【附加题:加分题】。

所有同学都可以忽略此题答案,学完课程自然就理解了。

说明:本题生产环境应用:这个功能可以用于IDC网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化或裁剪该图片,压缩js等措施。

本题需要输出三个指标: 【访问次数】 【访问次数*单个文件大小】 【文件名(可以带URL)】

[root@ctg files]# awk 'BEGIN{print "访问次数","文件名","访问次数*单个文件大小"}{i[$7]++}END{for(a in i){print i[a],a,$10*i[a]/1024"k"}}' url.txt |sort -n|column -t
访问次数  文件名                                                  访问次数*单个文件大小
1         /?=                                                     133.535k
1         /mobile/static/common/src/loadingimg.gif                133.535k
1         /mobile/theme/oldboyedu/home/images/150309/act_28.jpg   133.535k
1         /mobile/theme/oldboyedu/home/images/20150628/6.jpg      133.535k
1         /mobile/theme/oldboyedu/home/images/placeholder.jpg     133.535k
1         /online/oldboyeduonline/images/ajaxIndicator.gif        133.535k
1         /static/flex/vedioLoading.swf                           133.535k
1         /static/js/jquery.lazyload.js                           133.535k
1         /static/js/web_js.js                                    133.535k
2         /mobile/theme/oldboyedu/home/images/oldboy_logo.png     267.07k
2         /static/images/photos/2.jpg                             267.07k
3         /mobile/theme/oldboyedu/home/images/20151111/home3.png  400.605k

第一个里程碑-统计url/路径的重复数量。

 [root@oldboy34-niubility files]# awk '{hotel[$7]++}END{for(pol in hotel)print pol,hotel[pol]}' 12ti.txt |sort -rnk2
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3
/static/images/photos/2.jpg 2
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2
/static/js/web_js.js 1
/static/js/jquery.lazyload.js 1
/static/flex/vedioLoading.swf 1
/online/oldboyeduonline/images/ajaxIndicator.gif 1
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1
/mobile/static/common/src/loadingimg.gif 1
/?= 1
[root@oldboy34-niubility files]# awk '{hotel[$7]++}END{for(pol in hotel)print pol,hotel[pol]}' 12ti.txt |sort -rnk2|column -t
/mobile/theme/oldboyedu/home/images/20151111/home3.png  3
/static/images/photos/2.jpg                             2
/mobile/theme/oldboyedu/home/images/oldboy_logo.png     2
/static/js/web_js.js                                    1
/static/js/jquery.lazyload.js                           1
/static/flex/vedioLoading.swf                           1
/online/oldboyeduonline/images/ajaxIndicator.gif        1
/mobile/theme/oldboyedu/home/images/placeholder.jpg     1
/mobile/theme/oldboyedu/home/images/20150628/6.jpg      1
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg   1
/mobile/static/common/src/loadingimg.gif                1
/?=                                                     1

第二个里程碑-化简问题:

1.jpg 2000
1.jpg 2000
1.jpg 2000

1.jpg 被访问了3次 *2000 6000
6000=2000+2000+2000

访问次数*单个文件大小 相同的url/路径把对应的$10 大小 进行相加。

进行相加的时候 房间号码用什么?
$7

[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}' 12ti.txt 
[root@oldboy34-niubility files]# ###两个酒店房间号码一样。
[root@oldboy34-niubility files]# ###想取出两个酒店房间里面的内容。
[root@oldboy34-niubility files]# ###1.酒店名称 hotel  sum
[root@oldboy34-niubility files]# ###2.房间号码 


[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in hotel) print pol,hotel[pol],sum[pol]    }' 12ti.txt 
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg 1 31941
/mobile/theme/oldboyedu/home/images/placeholder.jpg 1 4722
/mobile/theme/oldboyedu/home/images/20151111/home3.png 3 410220
/?= 1 46232
/online/oldboyeduonline/images/ajaxIndicator.gif 1 0
/mobile/theme/oldboyedu/home/images/oldboy_logo.png 2 43816
/mobile/static/common/src/loadingimg.gif 1 20246
/static/js/web_js.js 1 4460
/static/images/photos/2.jpg 2 22598
/mobile/theme/oldboyedu/home/images/20150628/6.jpg 1 17283
/static/flex/vedioLoading.swf 1 3583
/static/js/jquery.lazyload.js 1 1627
[root@oldboy34-niubility files]# awk '{hotel[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in hotel) print pol,hotel[pol],sum[pol]    }' 12ti.txt |column -t
/mobile/theme/oldboyedu/home/images/150309/act_28.jpg   1  31941
/mobile/theme/oldboyedu/home/images/placeholder.jpg     1  4722
/mobile/theme/oldboyedu/home/images/20151111/home3.png  3  410220
/?=                                                     1  46232
/online/oldboyeduonline/images/ajaxIndicator.gif        1  0
/mobile/theme/oldboyedu/home/images/oldboy_logo.png     2  43816
/mobile/static/common/src/loadingimg.gif                1  20246
/static/js/web_js.js                                    1  4460
/static/images/photos/ 2.jpg                             2  22598
/mobile/theme/oldboyedu/home/images/20150628/6.jpg      1  17283
/static/flex/vedioLoading.swf                           1  3583
/static/js/jquery.lazyload.js                           1  1627
方法一:初级入学版本:
awk '{count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
方法二:高级只统计图片版本:
awk '$7~/(jpg|jpeg|png|gif)$/{count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
方法三:高级只统计图片版本不计算缓存版本。
awk '$7~/(jpg|jpeg|png|gif)$/ && $9 != 304 {count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log 
方法四:完全符合题意的答案
awk '$7~/(jpg|jpeg|png|gif)$/ && $9 != 304 {count[$7]++;size[$7]=$10}END{for(pol in count)print count[pol],count[pol]*size[pol],pol}' nginx-12.log 

第5章 扩展

5.1 分裂split
取出bash的版本号。 范围 变量从哪里开始分割

[root@ctg ~]# bash --version|awk 'NR==1{split($(NF-1),a,"\\(");print a[2]}'
1)-release
[root@ctg ~]# bash --version|awk 'NR==1{split($(NF-1),a,"\\(");print a[1]}'
[root@ctg ~]# bash --version|awk 'NR==1 {gsub(/-release/,"");{print $4}}'
4.1.2(1)

以冒号为分隔符,把/etc/passwd的第一列替换为ABC

[root@yum ~]# awk -F: 'sub($1,"ABC")' /etc/passwd
ABC:x:0:0:root:/root:/bin/bash
ABC:x:1:1:bin:/bin:/sbin/nologin
ABC:x:2:2:daemon:/sbin:/sbin/nologin
ABC:x:3:4:adm:/var/adm:/sbin/nologin
ABC:x:4:7:lp:/var/spool/lpd:/sbin/nologin
ABC:x:5:0:sync:/sbin:/bin/sync
ABC:x:6:0:shutdown:/sbin:/sbin/shutdown
ABC:x:7:0:halt:/sbin:/sbin/halt
ABC:x:8:12:mail:/var/spool/mail:/sbin/nologin
ABC:x:11:0:operator:/root:/sbin/nologin
ABC:x:12:100:games:/usr/games:/sbin/nologin
ABC:x:14:50:FTP User:/var/ftp:/sbin/nologin
ABC:x:99:99:Nobody:/:/sbin/nologin
ABC:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
ABC:x:999:997:systemd Bus Proxy:/:/sbin/nologin
ABC:x:998:996:systemd Network Management:/:/sbin/nologin
[root@yum ~]# awk -F: '$1="ABC"'  /etc/passwd
ABC x 0 0 root /root /bin/bash
ABC x 1 1 bin /bin /sbin/nologin
ABC x 2 2 daemon /sbin /sbin/nologin
ABC x 3 4 adm /var/adm /sbin/nologin
ABC x 4 7 lp /var/spool/lpd /sbin/nologin
ABC x 5 0 sync /sbin /bin/sync
ABC x 6 0 shutdown /sbin /sbin/shutdown
ABC x 7 0 halt /sbin /sbin/halt
ABC x 8 12 mail /var/spool/mail /sbin/nologin
ABC x 11 0 operator /root /sbin/nologin
ABC x 12 100 games /usr/games /sbin/nologin
ABC x 14 50 FTP User /var/ftp /sbin/nologin
ABC x 99 99 Nobody / /sbin/nologin
ABC x 170 170 Avahi IPv4LL Stack /var/lib/avahi-autoipd /sbin/nologin
ABC x 999 997 systemd Bus Proxy / /sbin/nologin

原创作品,请勿转载 http://www.cnblogs.com/Csir/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linux三剑客指的是 awk、sed 和 grep。 awk 是一种用来处理文本文件的工具,它可以根据指定的模式进行自动分割并进行数据处理。 sed 是一种流编辑器,它可以对文本文件进行替换、删除和插入操作。 grep 是一种文本搜索工具,它可以在文本文件中搜索指定的字符串。 ### 回答2: Linux三剑客,分别是awk、sed和grep,它们是Linux系统中非常重要的命令行工具,它们通常被称为文本处理工具。这些工具通常被用于筛选、搜索和处理文本文件。 grep是一种常见的文本搜索工具,可以在文件和文件夹中搜索指定的字符串或正则表达式。grep可以搜索多个文件并返回匹配行的输出。它是处理日志文件或查找匹配模式的最佳工具之一。 sed是一种流编辑器,可以按照行处理文本文件。它可以通过替换、删除和插入操作来修改文件内容。在大型文件中查找并替换模式是sed的主要作用。该工具通常在文本文件中提取有用信息是常用。 awk是一种强大的文本操作工具,可以分析大型文本文件并对其进行处理。该工具可以遍历行和列,并提供强大的文本处理工具,如计算、过滤和转换数据。awk的处理速度非常快,适用于处理大型数据文件。 Linux三剑客awk是最强大的工具,它可以执行复杂的文本数据操作和转换,可大大简化开发和管理过程。sed主要用于简单的文本数据过滤和替换,而grep主要用于搜索文件和定位特定行。 总之,Linux三剑客在文本数据处理方面具有不可替代的重要作用。对于Linux操作系统的开发人员和管理员来说,熟练使用这些工具可以提高他们的工作效率,使他们更容易管理和操作文本文件。 ### 回答3: Linux三剑客awk sed grep是我们在日常工作中经常使用的三个命令。它们都属于文本处理工具,可以用于查找、处理、分析文本文件等。 首先,grep是最常用的文本搜索工具。grep可以用来快速查找文件中指定的字符串或正则表达式,并将包含该字符串或正则表达式的行打印出来。常用的命令有grep、egrep和fgrep。比如,我们可以使用grep命令来查找一个文件中包含指定关键字的行,可以使用egrep来支持正则表达式搜索,使用fgrep来进行快速搜索,不支持正则表达式。 其次,sed是一种流编辑器,主要用于对文本文件进行替换、删除、添加、插入等操作。sed命令可以通过管道(|)将多个命令组合起来,从而进行复杂的文本操作。sed可以快速完成对文本文件的修改操作,比如替换文件中的某些内容、删除特定的行、在文件中插入新的文本等。sed的命令形式是“command", 比如"s/old/new/g",表示将old替换成new。 最后,awk是一种强大的文本处理工具,主要用于在文本文件中查找、处理以及格式化特定的字段。和grep、sed不同的是,awk更加灵活,可以在处理过程中做到数据过滤和加工,对于大数据的处理特别有用。awk命令的常用语法是"pattern {action}"。其中,pattern代表要匹配的模式,而action代表模式匹配时需要执行的动作,我们可以在其中添加处理语句来对文件进行各种处理操作,比如计算、统计、格式化等。 综上所述,Linux三剑客awk sed grep是我们在文本处理工作中不可或缺的三个工具,不同的工具可以用于处理不同的文本操作,也可以用于搭配使用,以完成更加复杂的文本处理工作。对于需要经常处理文本的人员来说,掌握这些工具是非常必要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值