第1章 awk指哪打哪
小编Q:972581034 交换群:605799367。有其他疑问可与小编或加群交换
知识点:
- 笔录与字段
- 情势匹配:形式与动作
- 主干的awk执行进度
- awk常用内置变量(预约义变量)
- awk数组
- awk语法:循环、条件
- awk常用函数
- 向awk传递参数
- awk引用shell变量
-
awk小程序及调试思路
[root@ctg ~]# awk --version|head -1 GNU Awk 3.1.7
Linux三剑客之awk精讲(基础与进阶)
标签(空格分隔): Linux实战教学笔记-陈思齐
原文:
1.1 awk内置变量
FS |
输入字段(列)分隔符 |
-F : |
相当于-vFS : |
NR |
number of record 行号(记录号) |
NF |
number of filed 每行有多少列 |
OFS |
output 输出分隔符 |
RS |
record separator 记录分隔符每一的结束标记 默认是回车 |
IGNORECASE |
是否忽略大小写 1为忽略 |
第1章 记录和字段
record记录==行, field字段约等于列,字段==列。
awk对各类要处理的输入数据认为都是有所格式和结构的,而不仅是一堆字符串。默许情状下,每一行内容都是一条记下,并以换行符分隔(\n)结束
敏捷跳转目录:
一、Linux三剑客之awk命令精讲
1.1.1 RS 记录分隔符 每一的停止标记默认是回车
[root@zeq files]# cat passwd.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin 默认结束标记是回车,现在文件内容为两行
以/作为记录分隔符,显示行号和文件内容
[root@zeq files]# awk -vRS="/" '{print NR,$0}' passwd.txt NR是显示行号 $0是显示一整行的内容
1 root:x:0:0:root:
2 root:
3 bin
4 bash
bin:x:1:1:bin:
5 bin:
6 sbin
7 nologin 现在以/为记录分隔符就变成了7行
这里的awk -vRS="/" -v给变量赋值,RS是awk内置变量,设置/为记录分隔符
1.1记录分隔符-RS
第1章 awk基础入门
要弄懂awk程序,必须熟谙明白那一个工具的条条框框。本实战笔记的目标是透过实际案例或面试题带同学们了解精通awk在公司中的用法,而不是awk程序的拉扯手册。
第1章 awk基础入门
1.2 awk中代表行和列
NR==1 |
第一行 |
$1 |
第一列 |
$NF |
最后一列 |
$NF-1 |
倒数第二列 |
awk默认景况下每一行都是一个记下(record)
RS
即 record
separator输入数据记录分隔符,每一行是怎么没的,表示每个记录输入的时候的分隔符,即行与行之间怎么分隔。
NR
即number of record记录(行)号,表示如今正值处理的笔录(行)的数码
ORS即output record separator输出记录分隔符
awk使用内置变量RS来存放输入记录分隔符,RS代表的是输入的笔录分隔符,那几个值可以通过BEGIN模块重新定义修改。
1.1 awk简介
- 一种名字怪异的语言
- 方式扫描和拍卖
awk不仅仅时linux系统中的一个限令,而且是一种编程语言,可以用来拍卖数据和浮动报告(excel)。处理的数额足以是一个或八个文件,可以是缘于专业输入,也得以通过管道获取标准输入,awk可以在指令行上直接编辑命令进行操作,也可以编写成awk程序来举办更为复杂的拔取。本章紧要教学awk命令的施用。
1.1 awk简介
awk不仅仅时linux系统中的一个指令,而且是一种编程语言,可以用来处理数量和转移报告(excel)。处理的数码足以是一个或四个公文,可以是来自专业输入,也能够透过管道获取标准输入,awk可以在指令行上直接编辑命令举办操作,也足以编写成awk程序来展开尤其复杂的应用。本章首要讲解awk命令的利用
1.3 awk格局匹配(条件)
情势-pattern 支持你找到想要的行
1)正则表明式
2)比较
>
<
==
3)范围
4)BEGIN{} END{}
小结:
gawk
RS=行分隔符(记录分隔符)
ORS=输出记录分隔符
FS=字段分隔符(列分隔符)
OFS=输出字段分隔符
$0=整个记录
NF= 列数
NR= 行数
在{print ,}中,逗号的情趣是OFS
BEGIN:紧要用以定义内置变量.
1.2 学完awk你可以操纵:
- 记录与字段
- linux三剑客之awk精讲,Linux三剑客之awk最佳实践。情势匹配:格局与动作
- 主干的awk执行进度
- awk常用内置变量(预约义变量)
- awk数组(工作常用)
- awk语法:循环,条件
- awk常用函数
- 向awk传递参数
- awk引用shell变量
- awk小程序及调试思路
1.2 awk环境简介
[root@chensiqi1 ~]# cat /etc/redhat-release CentOS release 6.8 (Final)
[root@chensiqi1 ~]# uname -r2.6.32-642.el6.x86_64
[root@chensiqi1 ~]# ll `which awk`lrwxrwxrwx. 1 root root 4 Dec 23 20:25 /bin/awk -> gawk
[root@chensiqi1 ~]# awk --versionGNU Awk 3.1.7Copyright (C) 1989, 1991-2009 Free Software Foundation.
1.4 正则表明式
~ |
某一列中包含xxx |
!~ |
某一列中不包含xxx |
^ |
以….开头的字符(列) |
$ |
以….什么结尾的 |
.* |
所有 |
^$ |
空行 |
\ |
转义字符 backslash 脱掉马甲打回原形 |
[] |
匹配[]的每一个字符 |
+ |
一个字符出现1次或1次以上 |
| |
或者 |
() |
反向引用,一个整体,保护里面的内容 |
* |
一个字符出现0次或者0次以上 |
{} |
0{n,m} 数字0连续出现了至少n次,最多m次 |
? |
一个字符出现0次或1次 |
1.2 对$0的认识
awk$0表示整行,其实awk使用$0来代表整条记录。记录分隔符
1.3 awk条件简介
[root@chensiqi1 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@chensiqi1 ~]# uname -r
2.6.32-642.el6.x86_64
[root@chensiqi1 ~]# ll `which awk`
lrwxrwxrwx. 1 root root 4 Dec 23 20:25 /bin/awk -> gawk
[root@chensiqi1 ~]# awk --version
GNU Awk 3.1.7
Copyright (C) 1989, 1991-2009 Free Software Foundation.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see http://www.gnu.org/licenses/.
1.4.1 awk正则表明式磨炼
成立环境
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 第三列是对应的ID号码
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.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的格式
- awk指令是由形式,动作,或者情势和动作的构成组成。
- 格局既pattern,可以接近掌握成sed的形式匹配,可以由表明式组成,也可以是几个正斜杠之间的正则表明式。比如NR==1,那就是方式,可以把他清楚为一个规则。
- 动作即action,是由在大括号里面的一条或多条语句组成,语句之间利用分号隔开。比如awk使用格式:
awk处理的内容能够来自专业输入(<),一个或多个公文文件或管道。
- pattern既方式,也足以知道为准绳,也叫找什么人,你找哪个人?高矮,胖瘦,男女?都是规范,既方式。
- action既动作,可以知晓为干啥,找到人自此您要做什么样。
形式和动作的详尽介绍大家放在后边部分,现在大家先对awk结构有一个精晓。
1.3 awk的格式
-
awk指令是由情势,动作,或者形式和动作的咬合组成。
-
方式既pattern,能够接近明白成sed的格局匹配,可以由表明式组成,也得以是多个正斜杠之间的正则表达式。比如NR==1,那就是方式,可以把她了然为一个规格。
-
动作即action,是由在大括号里面的一条或多条语句组成,语句之间选取分号隔开。比如awk使用格式:
-
pattern既情势,也足以明白为原则,也叫找哪个人,你找什么人?高矮,胖瘦,男女?都是规范,既形式。
-
action既动作,可以领悟为干啥,找到人随后你要做哪些。
形式和动作的详尽介绍我们身处前面部分,现在我们先对awk结构有一个叩问。
1.4.2 取出第3列中以数字4最先的行
[root@zeq files]# awk '$3~/^4/' reg.txt $3 第3列 ~ 包括 ^4 以4开头
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
1.4 awk记录知识小结:
- NR(number of record)存放着每个记录的号(行号)读取新行时候会活动+1
- RS(record
separator)是输入数据的笔录的分隔符,简单明了就是足以指定每个记录的结尾标志 - RS成效就是意味着一个笔录的收尾
- 当大家修改了RS的值,最好合作NR(行)来查阅变批,也就是修改了RS的值通过NR查看结果,调试awk程序
- ORS输出数据的笔录的相间符
1.5 情势动作
演示1-1: 基本的形式和动作
[root@chensiqi1 ~]# awk -F ":" 'NR>=2 && NR<=6{print NR,$1}' /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
命令说明:
-F 指定分隔符为冒号,相当于以“:”为菜刀,进行字段的切割。
NR>=2 && NR<=6:这部分表示模式,是一个条件,表示取第2行到第6行。
{print NR,$1}:这部分表示动作,表示要输出NR行号和$1第一列。
示例1-2 唯有格局
[root@chensiqi1 ~]# awk -F ":" 'NR>=2&&NR<=6' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
命令说明:
-F指定分隔符为冒号
NR>=2&&NR<=6这部分是条件,表示取第2行到第6行。
但是这里没有动作,这里大家需要了解如果只有条件(模式)没有动作,awk默认输出整行
演示1-3:只有动作
[root@chensiqi1 ~]# awk -F ":" '{print NR,$1}' /etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
6 sync
7 shutdown
8 halt
9 mail
10 uucp
以下省略....
命令说明:
-F指定分隔符为冒号
这里没有条件,表示对每一行都处理
{print NR,$1}表示动作,显示NR行号与$1第一列
这里要理解没有条件的时候,awk会处理每一行。
以身作则1-4:五个形式和动作
[root@chensiqi1 ~]# awk -F ":" 'NR==1{print NR,$1}NR==2{print NR,$NF}' /etc/passwd
1 root
2 /sbin/nologin
命令说明:
-F指定分隔符为冒号
这里有多个条件与动作的组合
NR==1表示条件,行号(NR)等于1的条件满足的时候,执行{print NR,$1}动作,输出行号与第一列。
NR==2表示条件,行号(NR)等于2的条件满足的时候,执行{print NR,$NF}动作,输出行号与最后一列($NF)
注意:
- Pattern和{Action}须要用单引号引起来,防止shell作解释。
- Pattern是可选的。假使不指定,awk将拍卖输入文件中的所有记录。如果指定一个方式,awk则只处理匹配指定的情势的记录。
- {Action}为awk命令,可以是但个指令,也足以七个指令。整个Action(包括内部的有着命令)都不可能不放在{
和 }之间。 - Action必须被{ }包裹,没有被{ }包裹的就是Patern
- file要拍卖的靶子文件
1.4 情势动作
演示1-1: 基本的形式和动作
[root@chensiqi1 ~]# awk -F ":" 'NR>=2 && NR<=6{print NR,$1}' /etc/passwd2 bin3 daemon4 adm5 lp6 sync
命令说明:
-F 指定分隔符为冒号,相当于以“:”为菜刀,进行字段的切割。
NR>=2 && NR<=6:这部分表示模式,是一个条件,表示取第2行到第6行。
{print NR,$1}:这部分表示动作,表示要输出NR行号和$1第一列。
示例1-2 唯有形式
[root@chensiqi1 ~]# awk -F ":" 'NR>=2&&NR<=6' /etc/passwdbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/sync命令说明:
-F指定分隔符为冒号
NR>=2&&NR<=6这部分是条件,表示取第2行到第6行。
但是这里没有动作,这里大家需要了解如果只有条件(模式)没有动作,awk默认输出整行
演示1-3:唯有动作
[root@chensiqi1 ~]# awk -F ":" '{print NR,$1}' /etc/passwd1 root2 bin3 daemon4 adm5 lp6 sync7 shutdown8 halt9 mail10 uucp
以下省略....
命令说明:
-F指定分隔符为冒号
这里没有条件,表示对每一行都处理
{print NR,$1}表示动作,显示NR行号与$1第一列
这里要理解没有条件的时候,awk会处理每一行。
以身作则1-4:多少个格局和动作
[root@chensiqi1 ~]# awk -F ":" 'NR==1{print NR,$1}NR==2{print NR,$NF}' /etc/passwd1 root2 /sbin/nologin
命令说明:
-F指定分隔符为冒号
这里有多个条件与动作的组合
NR==1表示条件,行号(NR)等于1的条件满足的时候,执行{print NR,$1}动作,输出行号与第一列。
NR==2表示条件,行号(NR)等于2的条件满足的时候,执行{print NR,$NF}动作,输出行号与最后一列($NF)
注意:
-
Pattern和{Action}必要用单引号引起来,避免shell作表达。
-
Pattern是可选的。假如不点名,awk将处理输入文件中的所有记录。假设指定一个格局,awk则只处理匹配指定的格局的笔录。
-
{Action}为awk命令,可以是但个指令,也足以八个指令。整个Action(包蕴内部的拥有命令)都必须放在{
和 }之间。 -
Action必须被{ }包裹,没有被{ }包裹的就是佩特n
-
file要处理的对象文件
1.4.3 展现Xiaoyu的姓氏和ID号码
[root@zeq files]# awk ' $2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
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的值等于逗号)
1.6 awk执行进程
在深远摸底awk前,大家要求了然awk如何处理公事的。
演示1-5 示例文件的创立
[root@chensiqi1 ~]# mkdir /server/files/ -p
[root@chensiqi1 ~]# head /etc/passwd > /server/files/awkfile.txt
[root@chensiqi1 ~]# cat /server/files/awkfile.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
以此文件仅包罗十行文件,大家选择下边的一声令下:
以身作则1-6 awk推行进度演示
[root@chensiqi1 ~]# awk 'NR>=2{print $0}' /server/files/awkfile.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
命令说明:
条件NR>=2,表示行号大于等于2时候,执行{print $0}显示整行。
awk是通过一行一行的处理文件,这条命令中包含模式部分(条件)和动作部分(动作),awk将处理模式(条件)指定的行
1.4.4 显示所有以41起头的ID号码的人的姓名和ID号码
[root@zeq files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
awk默认动作
[root@zeq files]# awk '$3~/^41/' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
[root@zeq files]# awk '$3~/^41/{print }' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
$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
1.6.1 小结awk执行进度
1)awk读入第一行内容
2)判断是还是不是吻合形式中的条件NR>=2
a,如若匹配则执行相应的动作{print $0}
b,借使不般配原则,继续读取下一行
3)继续读取下一行
4)重复进度1-3,直到读取到最终一行(EOF:end of file)
1.5 记录和字段
接下去自己给我们带来多个新定义记录和字段,那里为了有利于大家领会可以把记录就当做行即记录==行,字段约等于列,字段==列。
名称 | 含义 |
---|---|
record | 记录,行 |
field | 域,区域,字段,列 |
1.4.5 展现所有ID号码倒数一位数字是1或5的人的姓名
方法1
[root@zeq files]# awk '$3~/[15]$/{print $1,$2}' reg.txt []匹配里面的1和5 $表示以...结尾
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法2
[root@zeq files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt |或者 1或者5
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
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
1.7 记录和字段
接下去自己给咱们带来两个新定义记录和字段,那里为了有利于我们领略可以把记录就当做行即记录==行,字段约等于列,字段==列。
名称 | 含义 |
---|---|
record | 记录,行 |
field | 域,区域,字段,列 |
1.4.6 突显Xiaoyu的捐款.每个值时都有以$起首.如$520$200$135
[root@zeq files]# awk -F: -vOFS=$ '/Xiaoyu/{print "$"$2,$3,$4}' reg.txt
$155$90$201 -F指定:为分隔符 -vOFS=$输出$为分隔符
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
1.7.1 记录(行)
查阅一下底下那段文字
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
思考:
累计有稍许行呢?你如何驾驭的?通过哪些标志?
awk对各样要拍卖的输入数据认为都是怀有格式和结构的,而不只是一堆字符串。默认情形下,每一行内容都是一条记下,并以换行符分隔(\n)结束
1.5.1 记录(行)
查看一下底下那段文字
root:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltmail:x:8:12:mail:/var/spool/mail:/sbin/nologinuucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
思考:
一起有微微行啊?你怎么样精晓的?通过什么样标志?
awk对各类要拍卖的输入数据认为都是颇具格式和布局的,而不仅仅是一堆字符串。默许情形下,每一行内容都是一条记下,并以换行符分隔(\n)结束
1.5 awk替换
gsub awk内置函数
2.4 说明
awk在输出整行既$0的时候,仅仅是维持原状的出口整行,没有其他改动。那就招致一个难点,倘使本身修改了OFS,那么输出整行的时候print
$0的时候,也不会有任何改变。即:假如awk的action动作没有更改行的始末,OFS(包括ORS)都不会立见功效。
由此我们要求让awk知道$0被修改了,那些事情。
$1=$1是把$1的值赋值给$1,这明确不会修改任何内容,不过这些动作会通告awk我修改了$1的内容,所以再一次修改print
$0的时候,$0的情节就转变了。
那是一个小技巧
1.7.2 记录分隔符-RS
- awk默许意况下每一行都是一个记下(record)
- RS既record
separator输入输出数据记录分隔符,每一行是怎么没的,表示每个记录输入的时候的分隔符,既行与行时期什么分隔。 - NR既number of record
记录(行)号,表示如今正值处理的笔录(行)的编号。 - ORS既output record separator 输出记录分隔符。
awk使用内置变量RS来存放输入记录分隔符,RS表示的是输入的笔录分隔符,这几个值可以经过BEGIN模块重新定义修改。
以身作则1-1:使用“/”为默许记录分隔符
示范文件:
[root@chensiqi1 ~]# cat /server/files/awkfile.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@chensiqi1 ~]# awk 'BEGIN{RS="/"}{print NR,$0}' /server/files/awkfile.txt
1 root:x:0:0:root:
2 root:
3 bin
4 bash
bin:x:1:1:bin:
5 bin:
6 sbin
7 nologin
daemon:x:2:2:daemon:
8 sbin:
9 sbin
10 nologin
adm:x:3:4:adm:
11 var
12 adm:
13 sbin
14 nologin
lp:x:4:7:lp:
15 var
16 spool
17 lpd:
18 sbin
19 nologin
sync:x:5:0:sync:
20 sbin:
21 bin
22 sync
shutdown:x:6:0:shutdown:
23 sbin:
24 sbin
25 shutdown
halt:x:7:0:halt:
26 sbin:
27 sbin
28 halt
mail:x:8:12:mail:
29 var
30 spool
31 mail:
32 sbin
33 nologin
uucp:x:10:14:uucp:
34 var
35 spool
36 uucp:
37 sbin
38 nologin
命令说明:
在每行的开始先打印输出NR(记录号行号),并打印出每一行$0(整行)的内容。
我们设置RS(记录分隔符)的值为“/”,表示一行(记录)以“/”结束
在awk眼中,文件是从头到尾一段连续的字符串,恰巧中间有些\n(回车换行符),\n也是字符哦。
咱俩想起下“行(记录)”到底是什么意思?
- 行(记录):默认以\n(回车换行)停止。而以此行的终止不就是记录分隔符嘛。
- 所以在awk中,RS(记录分隔符)变量表示着行的扫尾符号(默许是回车换行)
在工作中,大家可以透过修改RS变量的值来决定行的了断标志,最后来决定“每行”的始末。
为了便于人们通晓,awk默许就把RS的值设置为“\n”
注意:
awk的BEGIN模块,我会在后面(形式-BEGIN模块)详细讲解,此处咱们仅必要知道在BEGIN模块里面大家来定义一些awk内置变量即可。
1.5.2 集团面试题:按单词出现频率降序排序(总计文件中各类单词的重新数量)
注:(此处使用sort与uniq即可)
题目:
题材创造方法:
sed -r '1,10s#[^a-zA-Z]+# #g' /etc/passwd>/server/files/count.txt
[root@chensiqi1 files]# cat /server/files/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
思路:
让具备单词排成一列,那样各种单词都是单身的一条龙
1)设置RS值为空格
2)将文件之中的具备空格替换为回车换行符“\n”
3)grep所有连接的假名,grep -o参数让她们排成一列。
1.5.1 格式
gsub(/要替换的内容/,”替换成什么”,替换的一部分)
2.5 awk特殊方式-BEGIN格局与END形式
1.7.3 对$0的认识
- 如1.7.2的例证,能够看到awk中$0表示整行,其实awk使用$0来代表整条记录。记录分隔符存在RS变量中,或者说每个记录以RS内置变量甘休。
- 除此以外,awk对每一行的记录号都有一个放置变量NR来保存,每处理完一条记下,NR的值就会活动+1
- 下边通过演示来深化映像。
示例1-2:NR记录号
[root@chensiqi1 ~]# awk '{print NR,$0}' /server/files/awkfile.txt
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
命令说明:
NR既number of record,当前记录的记录号,刚开始学也可以理解为行号。
$0表示整行或者说整个记录
1.6 字段与记录小结
方今您应有会对awk的记录字段有所领会了,下边大家总括一下,学会给阶段性知识总括是学好运维的必备技能。
-
RS记录分隔符,表示每行的竣工标志
-
NR行号(记录号)
-
FS字段分隔符,每列的相间标志或截止标志
-
NF就是每行有微微列,每个记录中字段的数据
-
$符号表示取某个列(字段),$1$2$NF
-
NF代表记录中的区域(列)数量,
$NF
取最终一个列(区域。) -
FS(-F)字段(列)分隔符,-F(FS)“:”<==>‘BEGIN{FS=’:’}’
-
RS 记录分隔符(行的竣事标识)
-
NR 行号
-
选好合适的刀FS(***),RS,OFS,ORS
-
相隔符==>为止标识
-
记录与区域,你就对我们所谓的行与列,有了新的认识(RS,FS)
1.5.2 接“显示Xiaoyu的捐款.每个值时都有以$开始.如$520$200$135”这一题
[root@zeq files]# awk '{gsub(/:/,"$"); 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@zeq files]# awk '$2~/Xiaoyu/{gsub(/:/,"$"); print $NF}' reg.txt $NF最后一列
$155$90$201
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
1.7.4 公司面试题:按单词出现频率降序排序(总括文件中各类单词的再一次数量)
注:(此处使用sort与uniq即可)
题目:
题目成立方法:
sed -r '1,10s#[^a-zA-Z]+# #g' /etc/passwd>/server/files/count.txt
[root@chensiqi1 files]# cat /server/files/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
思路:
让所有单词排成一列,这样各类单词都是单身的一条龙
1)设置RS值为空格
2)将文件之中的拥有空格替换为回车换行符“\n”
3)grep所有连接的假名,grep -o参数让他们排成一列。
方法一:
[root@chensiqi1 files]# awk 'BEGIN{RS="[ ]+"}{print $0}' count.txt | sort |uniq -c|sort
1
1 bash
1 lpd
2 daemon
2 lp
3 adm
3 halt
3 mail
3 root
3 shutdown
3 spool
3 sync
3 uucp
4 var
5 bin
6 nologin
10 x
12 sbin
方法二:
[root@chensiqi1 files]# cat count.txt | tr " " "\n" | sort | uniq -c | sort
1 bash
1 lpd
2 daemon
2 lp
3 adm
3 halt
3 mail
3 root
3 shutdown
3 spool
3 sync
3 uucp
4 var
5 bin
6 nologin
10 x
12 sbin
方法三:
[root@chensiqi1 files]# grep -o "[a-zA-Z]\+" count.txt | sort | uniq -c | sort
1 bash
1 lpd
2 daemon
2 lp
3 adm
3 halt
3 mail
3 root
3 shutdown
3 spool
3 sync
3 uucp
4 var
5 bin
6 nologin
10 x
12 sbin
第2章 awk进阶
1.6 范围
1、从第1行到第5行内容
awk ‘NR==1,NR==5’
2、从包罗某个内容的行到包罗某个内容的行
awk ‘/内容/,/内容/’
2.5.2 awk中变量的定义简介
直接定义,直接运用即可
awk中字母会被认为是变量,若是实在要给一个变量赋值字母(字符串),请使用双引号。
1.7.5 awk记录知识小结
- NR存放着每个记录的号(行号)读取新行时候会自动+1
- RS是输入数据的记录的分隔符,简单明了就是足以指定每个记录的最后标志。
- RS功效就是意味一个记录的利落
- 当大家修改了RS的值,最好合作NR(行)来查阅变化,也就是修改了RS的值通过NR查看结果,调试awk程序。
- ORS输出数据的笔录的相间符
awk学习技能一则:
小象放冰橱分几步?打开冰柜,把大象放进去,关闭冰柜门。
awk也是一样的,一步一步来,先修改了RS,然后用NR调试,看看究竟怎么着分隔的。然后经过sort排序,uniq
-c去重
1.6.1 彰显从第1行到第5行内容
[root@zeq files]# awk 'NR==1,NR==5' 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
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处理完所有输入行后才举行拍卖。
1.7.6 字段(列)
- 每条记下都是由八个区域(field)组成的,默许情状下区域之内的相间符是由空格(即空格或制表符)来分隔,并且将分隔符记录在放权变量FS中,每行记录的区域数保存在awk的内置变量NF中。
- FS既field
separator,输入字段(列)分隔符。分隔符就是菜刀,把一行字符串切为很多少个区域。 - NF既number of
fileds,表示一行中列(字段)的个数,可以驾驭为菜刀切过一行后,切成了不怎么份。
OFS输出字段(列)分隔符
- awk使用内置变量FS来记录区域分隔符的情节,FS可以在指令行上通过-F参数来改变,也可以透过BEGIN模块来改变。
- 下一场经过$n,n是整数,来取被切割后的区域,$1取第四个区域,$2取首个区域,$NF取最终一个区域。
下边大家经过演示来升高学习。
示范1-3:指定分隔符
[root@chensiqi1 files]# awk -F ":" 'NR>=2&&NR<=5{print $1,$3}' /server/files/awkfile.txt
bin 1
daemon 2
adm 3
lp 4
命令说明:
以:(冒号)为分隔符,显示第2行到第5行之间的第一区域和第三区域。
- 那边的FS知识一个字符,其实它可以指定几个的,此时FS指定的值可以是一个正则表达式。
- 好端端情状下,当您指定分隔符(非空格)的时候,例如指定七个区域分隔符,每个分隔符就是一把刀,把左右两边切为五个部分。
店铺面试题:再就是取出chensiqi和215379068这三个内容(指定多分隔符)
[root@chensiqi1 files]# echo "I am chensiqi,my qq is 1234567890">>/server/files/chensiqi.txt
[root@chensiqi1 files]# cat /server/files/chensiqi.txt
I am chensiqi,my qq is 1234567890
还要取出chensiqi和1234567890那多少个内容。
思路:
俺们用默许的想法三次选取一把刀,需求般配管道的。怎么着同时使用两把刀呢?看下边的结果
[root@chensiqi1 files]# awk -F "[ ,]" '{print $3,$NF}' /server/files/chensiqi.txt
chensiqi 1234567890
命令说明:
通过命令-F参数指定区域分隔符
[ ,]是正则表达式里面的内容,它表示一个整体,“一个”字符,既空格或者逗号(,),合并在一起,-F “[ ,]”就表示以空格或者逗号(,)为区域分隔符
小技巧:
在动作(‘{print
$3,$NF}’)里面的逗号,表示空格,其实动作中的逗号就是OFS的值,我们会在前面表达。刚起始大家把动作中的都逗号,当作空格即可。
以身作则:默许分隔符和点名分隔符会有些异样
[root@chensiqi1 files]# ifconfig eth0 | awk 'NR==2' >/server/files/awkblank.txt
[root@chensiqi1 files]# cat /server/files/awkblank.txt
inet addr:192.168.197.133 Bcast:192.168.197.255 Mask:255.255.255.0
#默认分隔符时候
[root@chensiqi1 files]# awk '{print $1}' /server/files/awkblank.txt
inet
#指定分隔符时候
[root@chensiqi1 files]# awk -F "[ :]+" '{print $1}' /server/files/awkblank.txt
[root@chensiqi1 files]# awk -F "[ :]+" '{print $2}' /server/files/awkblank.txt
inet
命令说明:
awk默认的FS分隔符对于空格序列,一个空格或多个空格tab都认为是一样的,一个整体。
- 那一个文件的开始有好多老是的空格,然后才是inet这几个字符
- 当我们运用默认的分隔符的时候,$1是有内容的。
- 当大家指定其余分隔符(非空格)时候,区域会有着变化
- 究竟为啥会这么,我们在此地不再深刻啄磨,只要精通有那种状态,注意一下即可。
2.1 awk方式与动作
接下去就详细介绍下,awk的方式都有二种:
-
正则表明式作为格局
-
正如表达式作为格局
-
限制情势
-
新鲜格局BEGIN和END
awk的情势是你玩好awk的要求也是最基础的情节,必须熟练通晓
1.6.2 突显包括Xiaoyu到含有Waiwai的行
[root@zeq files]# awk '/Xiaoyu/,/Waiwai/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
3.1 awk中的动作
在一个模式-动作语句中,模式决定动作什么时候执行,有时候动作会非常简单:一条单独的打印或赋值语句,在有些时候,动作有可能是多条语句,语句之间用换行符或分号分开。
awk的动作中如果有两个或两个以上的语句,需要用分号分隔。
动作部分理解为花括号里面的内容即可,总体分为:
表达式
流程控制语句
空语句
数组
1.7.7 ORS与OFS简介
近年来说说ORS和OFS这八个放置变量的含义。
- RS是输入记录分隔符,决定awk怎么样读取或分隔每行(记录)
- ORS代表输出记录分隔符,决定awk如何输出一行(记录)的,默许是回车换行(\n)
- FS是输入区域分隔符,决定awk读入一行后怎么再分为八个区域。
- OFS表示输出区域分隔符,决定awk输出每个区域的时候利用什么分隔她们。
- awk无比强大,你可以通过RS,FS决定awk如何读取数据。你也得以经过修改ORS,OFS的值指定awk怎样输出数据。
1.7 相比较表达式
$5>500 第五列大于500
NR>20 大于第20行的行,20行以后
>
>=
==
!= 不等于
<=
<
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
1.8 字段与记录小结
现在您应当会对awk的记录字段有所精通了,下边我们统计一下,学会给阶段性知识总计是学好运维的要求技能。
- RS记录分隔符,表示每行的收尾标志
- NR行号(记录号)
- FS字段分隔符,每列的相间标志或收尾标志
- NF就是每行有多少列,每个记录中字段的数码
$符号表示取某个列(字段),$1$2$NF
- NF代表记录中的区域(列)数量,
$NF
取最终一个列(区域。) - FS(-F)字段(列)分隔符,-F(FS)“:”<==>‘BEGIN{FS=’:’}’
- RS 记录分隔符(行的扫尾标识)
- NR 行号
- 选好合适的刀FS(***),RS,OFS,ORS
- 相隔符==>停止标识
- 记录与区域,你就对大家所谓的行与列,有了新的认识(RS,FS)
2.2 正则表明式作为方式
awk同sed一样也得以经过方式匹配来对输入的文本进行匹配处理。说到形式匹配,肯定少不了正则表明式,awk也支撑大气的正则表达式形式,半数以上与sed协助的元字符类似,而且正则表明式是玩转三剑客的画龙点睛工具,下表列出了awk辅助的正则表明式元字符:
awk默许就辅助的元字符:
元字符 | 功能 | 示例 | 解释 |
---|---|---|---|
^ | 字符串开头 | /^chensiqi/或\$3~/^chensiqi/ | 匹配所有以chensiqi开头的字符串;匹配出所有第三列中以chensiqi开头的 |
\$ | 字符串结尾 | /chensiqi$/或$3~/chensiqi$/ | 匹配所有以chensiqi结尾的字符串;匹配第三列中以chensiqi结尾的 |
.(点) | 匹配任意但个字符(包括回车符) | /c..l/ | 匹配字母c,然后两个任意字符,再以l结尾的行 |
* | 重复0个或多个前一个字符 | /a*cool/ | 匹配0个或多个a之后紧跟着cool的行 |
+ | 重复前一个字符一次或多次 | /a+b/ | 匹配一个或多个a加上字符串b的行 |
? | 匹配0个或一个前边的字符 | /a?b/ | 匹配以字母a或b或c开头的行 |
[] | 匹配指定字符组内的任一个字符 | /^[abc]/ | 匹配以字母a或b或c开头的行 |
[^] | 匹配不在指定字符组内的任一字符 | /^[^abc]/ | 匹配不以字母a或b或c开头的行 |
() | 子表达式组合 | /(chensiqi)+/ | 表示一个或多个cool组合,当有一些字符需要组合时,使用括号括起来 |
| |
或者的意思 | /(chensiqi)|B/ |
匹配chensiqi或字母B的行 |
awk默许不协理的元字符:(参数–posix)
元字符 | 功能 | 示例 | 解释 |
---|---|---|---|
x{m} | x字符重复m次 | /cool{5}/ | 匹配l字符5次 |
x{m,} | x字符重复至少m次 | /(cool){2,}/ | 匹配cool整体,至少2次 |
x{m,n} | x字符重复至少m次,但不超过n次 | /(cool){5,6}/ | 匹配cool整体,至少5次,最多6次 |
提示:
-
加括号表示全体卓殊,不加那么就合营前边的一个字符。awk默许不支持那种形式的正则,要求加–posix参数或者–re-interval
-
正则表达式的使用,默认是在行内查找匹配的字符串,若有万分则执行action操作,不过有时仅须要一定的列来协作指定的正则表明式,比如:我想取/etc/passwd文件中第五列{$5}这一列查找匹配mail字符串的行,那样就需求用别的五个门当户对操作符,并且awk里面唯有那多少个操作符来合作正则表达式。
1.7.1 查看磁盘音讯 df -h
[root@zeq files]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 7.8G 10G 44% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 61M 120M 34% /boot
/dev/sdb1 193M 1.8M 181M 1% /data
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
1.9 awk基础入门总计
到了此地我们回头看看,我们事先学习的始末。
- awk的命令行结构
- awk的情势和动作
- awk的笔录和字段
相比较基本常用的是字段。
别的这一个铺面面试题不过学会awk的必需,必须团结也能写出来。
2.2.1 awk正则匹配操作符
awk正则匹配操作符:
|~|用于对记录或区域的表明式进行匹配|
|–|–|
|!~|用于表达与~相反的意趣|
上面照旧经过具体示例来探望,awk如何来通过正则表明式匹配字符串的
1.7.2 突显出磁盘使用率大于20%的磁盘分区名称和挂载点(错误范例)
[root@zeq files]# df -h|awk '$5>20{print $1,$NF}'
Filesystem on
/dev/sda3 /
/dev/sda1 /boot
[root@zeq files]# df -h|awk '$5>9{print $1,$NF}' 这里会默认$5>9是字符串(字母)而不是比较表达
Filesystem on
4.3 awk实践进程
A. 命令行的赋值(-F或-v)
B. 执行BEGIN格局里面的内容
C. 开头读取文件
D. 判断标准(情势)是还是不是建立
树立则执行对应动作里面的始末
读取下一行,循环判断
真到读取到最终一个文件的终极
E.最后执行END格局里面的始末
F.结束
思想:
- awk主旨境想就是先拍卖,然后END模块输出。(累加(a++;a+=$0),awk数组)
- BEGIN模块用于awk内置变量FS,RS的赋值,打印标题头的音信。(excel表格里面标题行)
要在awk执行前,定义好。 - END模块用来最后输出,总计新闻,awk数组信息,(累加(a++;a+=$0),awk数组)
-
字段(列),记录(行)
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)
}
第2章 awk进阶
1.7.3 解决措施1 指定分隔符只保留数字有的
[root@zeq files]# df -h|awk -F"[% ]+" '$5>9{print $1,$NF}'
Filesystem on
/dev/sda3 /
/dev/sda1 /boot
想要去掉第一列Filesystem on音讯
[root@zeq files]# df -h|awk 'NR>1 && $5+0>9{print $1,$NF}' 第1行以后(&&并且)
/dev/sda3 /
/dev/sda1 /boot
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
2.1 awk方式与动作
接下去就详细介绍下,awk的形式都有三种:
- 正则表达式作为形式
- 正如表达式作为格局
- 限制情势
- 相当规方式BEGIN和END
awk的形式是你玩好awk的必备也是最基础的始末,必须熟谙了解
2.2.2 awk正则表明式匹配整行
[root@chensiqi1 files]# awk -F ":" '/^root/' awkfile.txt root:x:0:0:root:/root:/bin/bash
和下部的效益是一模一样的
[root@chensiqi1 files]# awk -F ":" '$0~/^root/' awkfile.txt root:x:0:0:root:/root:/bin/bash
提示:
awk只用正则表明式的时候是默许匹配整行的即‘$0~/^root/’和‘/^root/’是同样的。
1.7.4 解决方式2 某一列+0
[root@zeq files]# df -h|awk '$5+0>9{print $1,$NF}' 第5列做比较,第5列加0
/dev/sda3 /
/dev/sda1 /boot
小结:
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
2.2 正则表明式作为方式
awk同sed一样也足以由此情势匹配来对输入的公文进行匹配处理。说到形式匹配,肯定少不了正则表达式,awk也支撑大气的正则表达式情势,大多数与sed匡助的元字符类似,而且正则表明式是玩转三剑客的不可或缺工具,下表列出了awk支持的正则表明式元字符:
awk默许就协助的元字符:
元字符 | 功能 | 示例 | 解释 |
---|---|---|---|
^ | 字符串开头 | /^chensiqi/或$3~/^chensiqi/ | 匹配所有以chensiqi开头的字符串;匹配出所有第三列中以chensiqi开头的 |
$ | 字符串结尾 | /chensiqi$/或$3~/chensiqi$/ | 匹配所有以chensiqi结尾的字符串;匹配第三列中以chensiqi结尾的 |
.(点) | 匹配任意但个字符(包括回车符) | /c..l/ | 匹配字母c,然后两个任意字符,再以l结尾的行 |
* | 重复0个或多个前一个字符 | /a*cool/ | 匹配0个或多个a之后紧跟着cool的行 |
+ | 重复前一个字符一次或多次 | /a+b/ | 匹配一个或多个a加上字符串b的行 |
? | 匹配0个或一个前边的字符 | /a?b/ | 匹配以字母a或b或c开头的行 |
[] | 匹配指定字符组内的任一个字符 | /^[abc]/ | 匹配以字母a或b或c开头的行 |
[^] | 匹配不在指定字符组内的任一字符 | /^[^abc]/ | 匹配不以字母a或b或c开头的行 |
() | 子表达式组合 | /(chensiqi)+/ | 表示一个或多个cool组合,当有一些字符需要组合时,使用括号括起来 |
| |
或者的意思 | /(chensiqi)|B/ |
匹配chensiqi或字母B的行 |
awk默许不扶助的元字符:(参数–posix)
元字符 | 功能 | 示例 | 解释 |
---|---|---|---|
x{m} | x字符重复m次 | /cool{5}/ | 匹配l字符5次 |
x{m,} | x字符重复至少m次 | /(cool){2,}/ | 匹配cool整体,至少2次 |
x{m,n} | x字符重复至少m次,但不超过n次 | /(cool){5,6}/ | 匹配cool整体,至少5次,最多6次 |
提示:
- 加括号表示全部相当,不加那么就卓殊前面的一个字符。awk默许不接济这种样式的正则,须求加–posix参数或者–re-interval
- 正则表明式的行使,默许是在行内查找匹配的字符串,若有非凡则执行action操作,可是有时仅需要稳定的列来协作指定的正则表明式,比如:我想取/etc/passwd文件中第五列{$5}这一列查找匹配mail字符串的行,那样就须要用其余八个门当户对操作符,并且awk里面唯有那八个操作符来合营正则表达式。
1.8 特殊形式 BEGIN{} END{}
1)awk执行的进度
1.执行命令的参数(赋值) -F -v
2.BEGIN{} 里面的始末 (awk还并未起始读取文件内容)
3.读取文件内容
判断是不是满足条件(形式)
符合 执行命令(动作)
不符合 读取下一行直到最终一行
4.文件内容读取已毕后,开首执行END{}里面的情节
2)BEGIN{} 里面的内容会在 awk读取文件内容后面实施
1.出示标题
2.修改awk内置变量 创立变量
awk ‘BEGIN{OFS=:}’ 相当于 awk -vOFS=:
3.测试 计算
3)END{} awk读取完文件从此 执行
突显计算结果
先统计,END显示结果
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/act_28.jpg 133.535k
1 /mobile/theme/oldboyedu/home/6.jpg 133.535k
1 /mobile/theme/oldboyedu/homeplaceholder.jpg 133.535k
1 /online/oldboyeduonlinejaxIndicator.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/homeoldboy_logo.png 267.07k
2 /staticphotos/2.jpg 267.07k
3 /mobile/theme/oldboyedu/home/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/home3.png 3
/staticphotos/2.jpg 2
/mobile/theme/oldboyedu/homeoldboy_logo.png 2
/static/js/web_js.js 1
/static/js/jquery.lazyload.js 1
/static/flex/vedioLoading.swf 1
/online/oldboyeduonlinejaxIndicator.gif 1
/mobile/theme/oldboyedu/homeplaceholder.jpg 1
/mobile/theme/oldboyedu/home/6.jpg 1
/mobile/theme/oldboyedu/home/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/home3.png 3
/staticphotos/2.jpg 2
/mobile/theme/oldboyedu/homeoldboy_logo.png 2
/static/js/web_js.js 1
/static/js/jquery.lazyload.js 1
/static/flex/vedioLoading.swf 1
/online/oldboyeduonlinejaxIndicator.gif 1
/mobile/theme/oldboyedu/homeplaceholder.jpg 1
/mobile/theme/oldboyedu/home/6.jpg 1
/mobile/theme/oldboyedu/home/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/act_28.jpg 1 31941
/mobile/theme/oldboyedu/homeplaceholder.jpg 1 4722
/mobile/theme/oldboyedu/home/home3.png 3 410220
/?= 1 46232
/online/oldboyeduonlinejaxIndicator.gif 1 0
/mobile/theme/oldboyedu/homeoldboy_logo.png 2 43816
/mobile/static/common/src/loadingimg.gif 1 20246
/static/js/web_js.js 1 4460
/staticphotos/2.jpg 2 22598
/mobile/theme/oldboyedu/home/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/act_28.jpg 1 31941
/mobile/theme/oldboyedu/homeplaceholder.jpg 1 4722
/mobile/theme/oldboyedu/home/home3.png 3 410220
/?= 1 46232
/online/oldboyeduonlinejaxIndicator.gif 1 0
/mobile/theme/oldboyedu/homeoldboy_logo.png 2 43816
/mobile/static/common/src/loadingimg.gif 1 20246
/static/js/web_js.js 1 4460
/staticphotos/ 2.jpg 2 22598
/mobile/theme/oldboyedu/home/6.jpg 1 17283
/static/flex/vedioLoading.swf 1 3583
/static/js/jquery.lazyload.js 1 1627
2.2.1 awk正则匹配操作符
awk正则匹配操作符:
|~|用于对记录或区域的表明式举行匹配|
|–|–|
|!~|用于表明与~相反的意趣|
上面仍旧经过具体示例来看看,awk怎么着来通过正则表明式匹配字符串的
2.2.3 awk正则表明式匹配一行中的某一列
[root@chensiqi1 files]# awk -F ":" '$5~/shutdown/' awkfile.txt shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
提示:
-
$5代表第几个区域(列)
-
~表示极度(正则表明式匹配)
-
/shutdown/表示匹配shutdown这些字符串
统一在一块儿
$5~/shutdown/表示第一个区域(列)匹配正则表明式/shutdown/,既第5列蕴涵shutdown那些字符串,则显得这一行。
1.8.1 计算passwd.txt中虚构用户的多寡
[root@zeq files]# cat passwd.txt 查看文件虚拟用户为nologin
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
计算数据
[root@zeq files]# awk '/nologin$/{i=i+1}END{print i}' passwd.txt i=i+1相当于i++
6
方法一:初级入学版本:
awk '{count[$7]++;sum[$7]=sum[$7]+$10}END{for(pol in count)print count[pol],sum[pol],pol}' nginx-12.log
2.2.2 awk正则表明式匹配整行
[root@chensiqi1 files]# awk -F ":" '/^root/' awkfile.txt
root:x:0:0:root:/root:/bin/bash
和下边的意义是如出一辙的
[root@chensiqi1 files]# awk -F ":" '$0~/^root/' awkfile.txt
root:x:0:0:root:/root:/bin/bash
提示:
awk只用正则表明式的时候是默许匹配整行的即‘$0~/^root/’和‘/^root/’是同一的。
2.2.4 某个区域中的开端和终极
明亮了什么样运用正则表达式匹配操作符之后,大家来看看awk正则与grep和sed差别的地点。
awk正则表明式
|^|匹配一个字符串的初叶|
|–|–|
|$|匹配一个字符串的结尾|
在sed和grep这七个指令中,大家都把它们当作行的上马三保末段。然而在awk中他意味着的是字符串的早先和结尾。
接下去我们通过陶冶题来维系awk怎样利用正则表明式。
1.8.2 计算/etc/services 文件中空行的数码
[root@zeq files]# awk '/^$/{i++}END{print i}' /etc/services
16
方法二:高级只计算图片版本:
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
2.2.3 awk正则表明式匹配一行中的某一列
[root@chensiqi1 files]# awk -F ":" '$5~/shutdown/' awkfile.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
提示:
- $5代表第八个区域(列)
- ~表示突出(正则表明式匹配)
- /shutdown/表示匹配shutdown这么些字符串
集合在一齐
$5~/shutdown/表示第多个区域(列)匹配正则表明式/shutdown/,既第5列包涵shutdown那些字符串,则呈现这一行。
1.9 awk动作
gsub 函数 (命令)
变量 计算
艺术三:高级只总结图片版本不合算缓存版本。
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
2.2.4 某个区域中的开首和尾声
通晓了什么使用正则表明式匹配操作符之后,大家来探视awk正则与grep和sed分歧的地点。
awk正则表明式
|^|匹配一个字符串的初始|
|–|–|
|$|匹配一个字符串的结尾|
在sed和grep那多个指令中,我们都把它们当作行的起初和尾声。可是在awk中他意味着的是字符串的上三保太监最终。
接下去大家因此训练题来维系awk怎么样采纳正则表达式。
2.2.5 创立测试环境
说明:
-
第一列是姓氏
-
其次列是名字
-
率先列第二列合起来就是姓名
-
其三列是对应的ID号码
-
末段三列是一次捐款数额
1.9.1 计算磁盘使用率
[root@zeq files]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 19534104 8076500 10458644 44% /
tmpfs 502056 0 502056 0% /dev/shm
/dev/sda1 194241 62009 121992 34% /boot
/dev/sdb1 197209 1813 185003 1% /data
[root@zeq files]# df |awk 'NR>1{print $3/$2}'
0.413456
0
0.319237
0.00919329
方法四:完全符合题意的答案
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
2.2.5 创立测试环境
[root@chensiqi1 ~]# cat >>/server/files/reg.txt<<KOF
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
KOF
1.9.2 查看内存信息 free free -h
[root@zeq files]# free
total used free shared buffers cached
Mem: 1004112 806016 198096 236 101452 563232
-/+ buffers/cache: 141332 862780
Swap: 786428 420 786008
第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)
2.2.6 测试文件表明
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
说明:
- 第一列是姓氏
- 其次列是名字
- 率先列第二列合起来就是真名
- 其三列是对应的ID号码
- 终极三列是一次捐款多少
1.9.3 统计种类内存的使用率
[root@zeq files]# free |awk '/Mem/{print ($3-$6-$7)/$2}'
0.140705
[root@zeq files]# free|awk 'NR==3{print $3/($3+$4)}'
0.140705
以冒号为分隔符,把/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
原创小说,请勿转载
2.2.7 awk正则表明式练习题
勤学苦练题1:呈现姓Zhang的人的第二次捐款金额及他的名字
勤学苦练题2:展现Xiaoyu的名字和ID号码
磨练题3:呈现所有以41发端的ID号码的人的全名和ID号码
勤学苦练题4:展现所有以一个D或X开首的姓名全名
演习题5:突显所有ID号码最后一位数字是1或5的人的人名
勤学苦练题6:展现Xiaoyu的捐款,每个值都有以$开始。如$520$200$135
勤学苦练题7:显示所有人的全名,以姓,名的格式展现,如Meng,Feixue
2.2.6 awk正则表明式训练题-详解
1.9.4 统计连串内存的剩余率
[root@zeq files]# free|awk 'NR==3{print $4/($3+$4)}'
0.859211
2.2.8 awk正则表明式磨炼题-详解
以身作则1:展现姓Zhang的人的第二次捐款金额及她的名字
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$1~/^Zhang/{print $2,$(NF-1)}' reg.txt
Zhang 100
Zhang 90
说明:
- -F指定分隔符,现在大家知道了-F即FS也是帮忙正则表明式的。
- 【 :】+ 表示一连的空格或冒号
- -F “【 :】+” 以三番五次的空格或冒号为分隔符
- /Zhang/表示原则,整行中含有Dan字符的那个原则。
- {print $1,$(NF-1)}
表示动作,满意条件后,执行展现第一列($1)和尾数第二列($(NF-1))当然$5也可以。
注意:
NF是单排中有多少列,NF-1整行就是倒数第二列。
$(NF-1)就是取尾数第二列内容。
以身作则2:突显Xiaoyu的姓氏和ID号码
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$2~/^Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
命令说明:
指定分隔符-F “【:】+”
$2~/Xiaoyu/表示条件,第二列包含Xiaoyu时候执行对应的动作
{print $1,$3}表示动作,显示第一列和第三列的内容
以身作则3:显示所有以41方始的ID号码的人的人名和ID号码
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$3~/^(41)/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
示例4:突显所有以一个D或X开头的真名全名
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$2~/^D|^X/{print $1,$2}' reg.txt
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
命令说明:
-F “【 :】+”指定分隔符
|表示或,^以...开头
注意:
那里要用()括号表示即^(D|X)相当于^D|^X,有的同学写成^D|X那样是不对的。
示范5:显示所有ID号码倒数一位数字是1或5的人的真名
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$3~/1$|5$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
示例6:突显Xiaoyu的捐款,每个值都有以$初始。如$520$200$135
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ :]+" '$2~/Xiaoyu/{print "$"$4"$"$5"$"$6}' reg.txt
$155$90$201
示例7:凸显所有人的姓名,以姓,名的格式突显,如Meng,Feixue
[root@chensiqi1 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@chensiqi1 files]# awk -F "[ ]+" '{print $1","$2}' reg.txt
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai
示范1:显示姓Zhang的人的第二次捐款金额及她的名字
说明:
-
-F指定分隔符,现在大家知晓了-F即FS也是永葆正则表明式的。
-
【 :】+ 表示延续的空格或冒号
-
-F “【 :】+” 以一而再的空格或冒号为分隔符
-
/Zhang/表示原则,整行中富含Dan字符的那一个标准。
-
{print $1,$(NF-1)}
表示动作,知足条件后,执行显示第一列($1)和倒数第二列($(NF-1))当然$5也得以。
注意:
NF是单排中有些许列,NF-1整行就是倒数第二列。
$(NF-1)就是取尾数第二列内容。
示范2:突显Xiaoyu的姓氏和ID号码
示范3:显示所有以41早先的ID号码的人的人名和ID号码
示例4:呈现所有以一个D或X初叶的真名全名
注意:
那边要用()括号表示即^(D|X)相当于^D|^X,有的同学写成^D|X这样是漏洞百出的。
以身作则5:彰显所有ID号码最后一位数字是1或5的人的真名
示例6:突显Xiaoyu的捐款,每个值都有以$开头。如$520$200$135
示例7:呈现所有人的人名,以姓,名的格式展现,如Meng,Feixue
1.9.5 设置变量总计系列内存的使用率和剩余率
[root@zeq files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}' sum为变量
0.140765 0.859235
2.2.9 公司面试题:取出网卡eth0的ip地址
最简单:hostname -I
awk处理:
方法一:
[root@chensiqi1 files]# ifconfig eth0|awk 'BEGIN{RS="[ :]"}NR==31'
192.168.197.133
方法二:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'
192.168.197.133
方法三:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
192.168.197.133
方法四:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'
192.168.197.133
提示:
- 前方的二种艺术都依旧相比较好驾驭的,那第三种格局,须要学会逆向思维,看看大家要的结果10.0.0.50,ip地址:数字和点(.),我是还是不是足以指定分隔符,以数字和点以外的字符为分隔符呢?
- 换句话说就是要解除数字和点(.)正则表达式与解除常用的就是[^0-9.]即不匹配数字和点(.)
- 最后-F “[^0-9]”位分隔符,然则要拔取+,表示一连的。合起来就是:awk
-F “[^0-9.]+” ‘NR==2{print $2}’
注意:
正则表明式是玩好awk的需求条件,必会了然
2.2.7 公司面试题:取出网卡eth0的ip地址
最简单:hostname -I
awk处理:
方法一:
[root@chensiqi1 files]# ifconfig eth0|awk 'BEGIN{RS="[ :]"}NR==31'192.168.197.133
方法二:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'192.168.197.133
方法三:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'192.168.197.133
方法四:
[root@chensiqi1 files]# ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'192.168.197.133
2.2.10 明精通白扩张正则表明式:+(加号)
[root@chensiqi1 files]# echo "------======1########2"
------======1########2
[root@chensiqi1 files]# echo "------======1########2" | grep "[-=#]"
------======1########2
[root@chensiqi1 files]# echo "------======1########2" | grep -o "[-=#]"
-
-
-
-
-
-
=
=
=
=
=
=
#
#
#
#
#
#
#
#
2.2.8 awk正则之{} -花括号
awk中的花括号有点不常用,不过有时会用到此处大约介绍。
示例:取出awkfile中率先列蕴含一个o或者三个o的行
2.2.11 awk正则之{} -花括号
awk中的花括号有点不常用,可是有时会用到那边大致介绍。
示例:取出awkfile中第一列包蕴一个o或者多少个o的行
[root@chensiqi1 files]# awk -F: '$1~/o{1,2}/' awkfile.txt
[root@chensiqi1 files]# awk -F: --posix '$1~/o{1,2}/' awkfile.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@chensiqi1 files]# awk -F: --re-interval '$1~/o{1,2}/' awkfile.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2.2.9 公司案例1:取出常用服务端口号
思路:
linux下边服务与端口新闻的照应表格在/etc/services里面,所以这道题要拍卖/etc/services文件。
大家大约解析以下servics文件:
从23行发轫基本上每一行首先列是劳动名称,第二列的率先有些是端口号,第二列的第二有的是tcp或udp协议。
方法:
[root@chensiqi1 ~]#
awk -F “[ /]+”
‘$1~/^(ssh)$|^(http)$|^(https)$|^(mysql)$|^(ftp)$/{print $1,$2}’ /etc/services |sort|uniq
ftp 21
http 80
https 443
mysql 3306
ssh 22
2.2.12 公司案例1:取出常用服务端口号
思路:
linux上边服务与端口音信的附和表格在/etc/services里面,所以那道题要拍卖/etc/services文件。
我们简要解析以下servics文件:
[root@chensiqi1 ~]# sed -n '23,30p' /etc/services
tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
从23行开首基本上每一行首先列是服务名称,第二列的率先有些是端口号,第二列的第二有的是tcp或udp协议。
方法:
[root@chensiqi1 ~]# awk -F "[ /]+" '$1~/^(ssh)$|^(http)$|^(https)$|^(mysql)$|^(ftp)$/{print $1,$2}' /etc/services |sort|uniq
ftp 21
http 80
https 443
mysql 3306
ssh 22
提示:
- |是或者的意思,正则表明式
- sort是将出口结果排序
- uniq是去重新但不标记重复个数
- uniq -c去重新但标志重复个数
2.2.13 公司案例2:取出常用服务端名称
同桌们自己尝尝下
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.3 比较表明式做为方式-需求有的例子
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.3.1 集团面试题:取出文件/etc/services的23~30行
思路:
想表示一个范围,一个行的限制,就要选拔NR那几个松手变量了,同时也要用到比较表达式。
答案:
[root@www ~]# awk 'NR>=23&&NR<=30' /etc/services
[root@www ~]# awk 'NR>22&&NR<31' /etc/services
过程:
[root@www ~]# awk 'NR>=23&&NR<=30' /etc/services
tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
[root@www ~]# awk 'NR>22&&NR<31' /etc/services
tcpmux 1/tcp # TCP port service multiplexer
tcpmux 1/udp # TCP port service multiplexer
rje 5/tcp # Remote Job Entry
rje 5/udp # Remote Job Entry
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
说明:
1)比较表明式比较常用的仍然代表大于等于,小于等于依旧等于,根据这一个事例来上学即可
2)NR代表行号,大于等于23即,NR>=23低于等于30,即NR<=30
3)合起来就是NR>=23而且NR<=30,&&代表还要,同时建立的趣味。
4)换一种表达式方法就是当先22行小于31行,即NR>22&&NR<31
2.3.2 倘使判断某一列是不是等于某个字符呢?
示范:找出/etc/passwd中第五列是root的行
测试文件:
[root@www ~]# cat /server/files/awk_equal.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:rootroot:/root:/bin/bash
root:x:0:0:rootrooot:/root:/bin/bash
root:x:0:0:rootrooot:/root:/bin/bash
root:x:0:0:/root:/bin/bash
答案:
awk -F":" '$5=="root"' /server/files/awk_equal.txt
awk -F":" '$5~/^root$/' /server/files/awk_equal.txt
过程:
#方法一:
[root@www ~]# awk -F":" '$5=="root"' /server/files/awk_equal.txt
root:x:0:0:root:/root:/bin/bash
#方法二:
[root@www ~]# awk -F":" '$5~/^root$/' /server/files/awk_equal.txt
root:x:0:0:root:/root:/bin/bash
俺们假使想要完全匹配root那一个字符串,那就用$5=="root"
即可,那也是答案里面给大家的。
方法二:
此题也可因此正则匹配来限制root的字符串。$5~/^root$/
2.3.1 公司面试题:取出文件/etc/services的23~30行
思路:
想表示一个限量,一个行的范围,就要动用NR这么些放手变量了,同时也要用到比较表明式。
答案:
[root@www ~]# awk ‘NR>=23&&NR<=30’
/etc/services
[root@www ~]# awk ‘NR>22&&NR<31’
/etc/services
说明:
1)相比较表明式比较常用的或者代表大于等于,小于等于照旧等于,依照那么些例子来读书即可
2)NR表示行号,大于等于23即,NR>=23稍差于等于30,即NR<=30
3)合起来就是NR>=23并且NR<=30,&&表示还要,同时建立的意趣。
4)换一种表明式方法就是过量22行小于31行,即NR>22&&NR<31
2.4 范围格局
pattern1 | pattern2 | |
---|---|---|
从哪里来 | 到 | 哪里去 |
条件1 | 条件2 |
- 界定方式不难通晓就是从哪儿来,到哪里去。
- 极度从标准1起来到条件2介绍的范围
1)还记得sed使用地方范围来处理公事内容嘛?awk的界定格局,与sed类似,可是又有例外,awk无法平素动用行号来作为限制初始地址,因为awk具有内置变量NR来囤积记录号,所有必要利用NR=1,NR=5那样来行使。
2)限定格局处理的准绳是:先匹配从第二个方式的首次现身到第三个方式的首次面世之间的始末,执行action。然后匹配从第三个形式的下一遍面世到首个格局的下四次出现,直到文本截至。要是匹配到第二个情势而从不匹配到第四个情势,则awk处理从首个模式初叶直到文本停止所有的行。倘使第二个格局不合作,尽管首个方式匹配,awk依然不处理任何行。
awk '/start pos/,/end pos/{print $)} passwd chensiqi'
awk '/start pos/,NR==XXX{print $0}' passwd chensiqi
界定方式的时候,范围条件的时候,表明式必须能匹配一行。
示例1:
[root@www files]# awk 'NR==2,NR==5{print NR,$0}' count.txt
2 bin x bin bin sbin nologin
3 daemon x daemon sbin sbin nologin
4 adm x adm var adm sbin nologin
5 lp x lp var spool lpd sbin nologin
说明:
规则是:从第二行,到第五行
动作是:突显行号(NR)和整行($0)
合起来就是彰显第二行到第五行的行好和整行的内容
示例2:
[root@www files]# awk '/^bin/,NR==5{print NR,$0}' awkfile.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
说明:
规范是:从以bin开始的行,到第五行
动作是:显示行号和整行内容
合起来就是突显从以bin起初的行,到第五行中的行号和整行内容。
示例3:
[root@www files]# awk -F":" '$5~/^bin/,/^lp/{print NR,$0}' awkfile.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
说明:
规范:从第五列以bin开首的行到以lp起初的行
动作:突显行号和正航内容
合起来:从第三列以bin初始的行到以lp早先的行并显示其行号和整行内容
[root@www files]# awk -F: '$5~/^bin/,$5~/^lp/{print NR,$0}' awkfile.txt
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
说明:
条件:从第三列以bin先导字符串的行到第三列以lp开首字符串的行
动作:突显行号和整行
2.5 awk特殊方式-BEGIN形式与END情势
- BEGIN模块再awk读取文件从前就推行,一般用来定义大家的放置变量(预订义变量,eg:FS,RS),可以出口表头(类似excel表格名称)
- BEGIN情势从前大家有在示范中涉嫌,自定义变量,给内容变量赋值等,都采用过。须求专注的是BEGIN情势前边要接跟一个action操作块,包涵在大括号内。awk必须在输入文件举办任何处理前先举办BEGIN里的动作(action)。大家得以不要别的输入文件,就可以对BEGIN模块进行测试,因为awk需求先实施完BEGIN形式,才对输入文件做拍卖。BEGIN情势平常被用来修改内置变量ORS,RS,FS,OFS等值。
2.3.2 如若判断某一列是不是等于某个字符呢?
以身作则:找出/etc/passwd中第五列是root的行
测试文件:
答案:
2.5.1 BEGIN模块
1)第三个成效,内置变量的定义
示例:取eth0的IP地址
答案:
[root@www files]# ifconfig eth0|awk -F "(addr:)|( Bcast:)" 'NR==2{print $2}'
192.168.197.133
[root@www files]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'
192.168.197.133
[root@www files]# ifconfig eth0 | awk -F "[^0-9.]+" 'NR==2{print $2}'
192.168.197.133
#上面的也可以写成
[root@www files]# ifconfig eth0 | awk 'BEGIN{FS="(addr:)|( Bcast:)"} NR==2{print $2}'
192.168.197.133
[root@www files]# ifconfig eth0 | awk 'BEGIN{FS="[ :]+"}NR==2{print $4}'
192.168.197.133
[root@www files]# ifconfig eth0 | awk 'BEGIN{FS="[^0-9.]+"}NR==2{print $2}'
192.168.197.133
注意:
指令行-F本质就是修改的FS变量
2)首个职能,在读取文件此前,输出些提示性音信(表头)。
[root@www files]# awk -F: 'BEGIN{print "username","UID"}{print $1,$3}' awkfile.txt
username UID #这就是输出的表头信息
root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
说明:
要在首先行输出一些username和UID,大家应有想到BEGIN{}那些万分的原则(方式),因为BEGIN{}在awk读取文件此前实施的。
由此结果是BEGIN{print "username","UID"}
,注意print命令里面双引号吃什么吐什么,原样输出。
下一场我们落到实处了在出口文件内容后面输出“username”和“UID”,下一步输出文件的率先列和第三列即{print $1,$3}
最终结果就是BEGIN{print "username","UID"}{print $1,$3}
3)第多个效益,使用BEGIN模块的特有性质,进行局部测试。
[root@www files]#简单输出内容:
[root@www files]# awk 'BEGIN{print "hello world!"}'
hello world!
[root@www files]# #进行计算
[root@www files]# awk 'BEGIN{print 10/3}'
3.33333
[root@www files]# awk 'BEGIN{print 10/3+1}'
4.33333
[root@www files]# awk 'BEGIN{print 10/3+1/4*9}'
5.58333
[root@www files]# #和变量有关的操作
[root@www files]# awk 'BEGIN{a=1;b=2;print a,b}'
1 2
[root@www files]# awk 'BEGIN{a=1;b=2;print a,b,a+b}'
1 2 3
4)第种种用法:合作getline读取文件,后边awk函数处上课
2.4 范围格局
pattern1 | pattern2 | |
---|---|---|
从哪里来 | 到 | 哪里去 |
条件1 | 条件2 |
-
限制情势简单明白就是从什么地方来,到何地去。
-
匹配从标准1开端到标准2介绍的限定
1)还记得sed使用地方范围来处理公事内容嘛?awk的限定格局,与sed类似,不过又有两样,awk无法一向动用行号来作为限制起头地址,因为awk具有内置变量NR来储存记录号,所有须求利用NR=1,NR=5这样来利用。
2)界定情势处理的准绳是:先匹配从第二个格局的首次面世到第一个格局的首次出现之间的情节,执行action。然后匹配从第三个情势的下几次面世到首个形式的下五次出现,直到文本截止。即使合作到第三个格局而并未匹配到第一个方式,则awk处理从第四个形式开首直到文本为止所有的行。要是第三个方式不般配,就算第三个方式匹配,awk依然不处理任何行。
awk '/start pos/,/end pos/{print $)} passwd chensiqi'
awk '/start pos/,NR==XXX{print $0}' passwd chensiqi
限定方式的时候,范围条件的时候,表达式必须能匹配一行。
说明:
标准是:从第二行,到第五行
动作是:展现行号(NR)和整行($0)
合起来就是突显第二行到第五行的行好和整行的内容
示例2:
说明:
标准是:从以bin开始的行,到第五行
动作是:显示行号和整行内容
合起来就是突显从以bin开首的行,到第五行中的行号和整行内容。
示例3:
说明:
标准:从第五列以bin初叶的行到以lp开始的行
动作:展现行号和正航内容
合起来:从第三列以bin开首的行到以lp开端的行并展现其行号和整行内容
说明:
基准:从第三列以bin初阶字符串的行到第三列以lp伊始字符串的行
动作:突显行号和整行
2.5.2 awk中变量的定义简介
- 直白定义,直接接纳即可
- awk中字母会被认为是变量,假诺实在要给一个变量赋值字母(字符串),请使用双引号
[root@chensiqi files]# awk 'BEGIN{a=abcd;print a}'
[root@chensiqi files]# awk 'BEGIN{abcd=123456;a=abcd;print a}'
123456
[root@chensiqi files]# awk 'BEGIN{a="abcd";print a}'
abcd
说明:
没有公文awk依然可以处理BEGIN格局下的动作(命令)
2.5.3 END模块
EHD在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结果(累加,数组结果),也得以是和BEGIN模块类似的末段标识信息
[root@chensiqi files]# awk 'BEGIN{print "hello world!"}{print NR,$0}END{print "end of file"}' count.txt
hello world!
1 root x root root bin bash
2 bin x bin bin sbin nologin
3 daemon x daemon sbin sbin nologin
4 adm x adm var adm sbin nologin
5 lp x lp var spool lpd sbin nologin
6 sync x sync sbin bin sync
7 shutdown x shutdown sbin sbin shutdown
8 halt x halt sbin sbin halt
9 mail x mail var spool mail sbin nologin
10 uucp x uucp var spool uucp sbin nologin
end of file
与BEGIN情势相呼应的END情势,格式一样,但是END形式仅在awk处理完所有输入行后才进行拍卖。
商家案例:统计/etc/servies文件里的空行数量
思路:
a)空行通过正则表明式来兑现:^$
b)计算数据:
- grep -c
- awk
方法一:grep
[root@chensiqi files]# grep "^$" /etc/services | wc -l
16
[root@chensiqi files]# grep -c "^$" /etc/services
16
说明:
grep命令-c表示count计数统计包含^$的行一共有多少。
方法二:
[root@chensiqi files]# awk '/^$/{i++}END{print i}' /etc/services
16
提示:
运用了awk的技能功用,很常用
先是步:总括空行个数
/^$/
意味着原则,匹配出空行,然后实施{i++}(i++等于i=i+1)即:/^$/{i=i+1}
大家可以经过/^$/{i=i+1;print i}
来查阅awk执行进度
[root@chensiqi files]# awk '/^$/{i=i+1;print "the value of i is:"i}' /etc/services
the value of i is:1
the value of i is:2
the value of i is:3
the value of i is:4
the value of i is:5
the value of i is:6
the value of i is:7
the value of i is:8
the value of i is:9
the value of i is:10
the value of i is:11
the value of i is:12
the value of i is:13
the value of i is:14
the value of i is:15
the value of i is:16
第二步:输出末了结果
- 唯独大家只想要最终的结果16,不想要进程如何做?使用END形式输出结果
- 因为END情势的异样属性所以很合乎输出最后结出
为此最后结出就是awk '/^$/{i=i+1}END{print "blank lines count:"i}' /etc/services
awk编程思想:
- 先拍卖,最终再END模块输出
{print NR,$0}body
模块处理,处理落成后END{print "end of file"}
出口一个结实
公司面试题5:文件count.txt,文件内容是1到100(由seq
100转移),请计算文件每行值加起来的结果(总结1+…+100)
思路:
文本每一行都有且只有一个数字,所以我们要让文件的每行内容相加。
回顾一下上一道题大家用的是i++即i=i+1
那边大家需求利用到第四个常用的表明式
i=i+$0
比较一下,其实只是把上边的1换成了$0
[root@chensiqi files]# awk '{i=i+$0}END{print i}' count.txt
5050
2.5 awk特殊形式-BEGIN情势与END情势
-
BEGIN模块再awk读取文件在此之前就进行,一般用来定义大家的放到变量(预约义变量,eg:FS,RS),可以输出表头(类似excel表格名称)
-
BEGIN格局从前大家有在演示中关系,自定义变量,给内容变量赋值等,都接纳过。需求专注的是BEGIN方式后边要接跟一个action操作块,包罗在大括号内。awk必须在输入文件进行其余处理前先举办BEGIN里的动作(action)。我们可以不要此外输入文件,就足以对BEGIN模块进行测试,因为awk要求先实施完BEGIN形式,才对输入文件做处理。BEGIN方式日常被用来修改内置变量ORS,RS,FS,OFS等值。
2.6 awk中的动作
在一个情势-动作语句中,方式决定动作如曾几何时候实施,有时候动作会格外不难:一条单独的打印或赋值语句。在稍微时候,动作有可能是多条语句,语句之间用换行符或分集团分开。
awk的动作中一经有八个或八个以上的讲话,须要用分号分隔
动作部分豪门领悟为花括号内部的始末即可,总体分为:
- 表达式
- 流程控制语句
- 空语句
- 数组(以后假设有时间的话会再写一个awk高级部分进行介绍)
2.7 awk情势与动作小结
- awk命令宗旨由方式和动作结合
- 情势就是规则,动作就是现实怎么
1)正则表明式:必须控制正则,明白
2)条件表明式:比尺寸,比较是或不是等于
3)范围表达式:从哪儿来到哪个地方去 - 留神BEGIN或END模块只好有一个。BEGIN{}BEGIN{}或者END{}END{}都是漏洞百出的。
2.5.1 BEGIN模块
1)第四个作用,内置变量的定义
示例:取eth0的IP地址
答案:
2)第三个效益,在读取文件以前,输出些提醒性音信(表头)。
说明:
要在率先行输出一些username和UID,大家相应想到BEGIN{}这么些特殊的标准化(方式),因为BEGIN{}在awk读取文件往日实施的。
故此结果是BEGIN{print "username","UID"}
,注意print命令里面双引号吃什么吐什么,原样输出。
下一场大家落到实处了在出口文件内容前边输出“username”和“UID”,下一步输出文件的首先列和第三列即{print $1,$3}
最终结果就是BEGIN{print "username","UID"}{print $1,$3}
3)第多少个功效,使用BEGIN模块的例外质量,举办一些测试。
2.8 总括awk执行进度
遥想一下awk的社团
awk -F 指定分隔符 ‘BRGIN{}END{}’,如下图
#awk完整执行过程
[root@chensiqi ~]# awk -F ":" 'BEGIN{RS="/";print "hello world!"}{print NR,$0}END{print "end of file"}' /server/files/awkfile.txt
hello world!
1 root:x:0:0:root:
2 root:
3 bin
4 bash
bin:x:1:1:bin:
5 bin:
6 sbin
7 nologin
daemon:x:2:2:daemon:
8 sbin:
9 sbin
10 nologin
adm:x:3:4:adm:
11 var
12 adm:
13 sbin
14 nologin
lp:x:4:7:lp:
15 var
16 spool
17 lpd:
18 sbin
19 nologin
sync:x:5:0:sync:
20 sbin:
21 bin
22 sync
shutdown:x:6:0:shutdown:
23 sbin:
24 sbin
25 shutdown
halt:x:7:0:halt:
26 sbin:
27 sbin
28 halt
mail:x:8:12:mail:
29 var
30 spool
31 mail:
32 sbin
33 nologin
uucp:x:10:14:uucp:
34 var
35 spool
36 uucp:
37 sbin
38 nologin
end of file
说明:
咱俩·同时再命令行定义了分隔符和在BEGIN形式中定义了RS内置变量,在最后经过END格局输出了结果
2.9 awk数组
awk提供了数组来存放一组有关的值。
awk是一种编程语言,肯定也支撑数组的使用,不过又分裂于c语言的数组。数组在awk中被誉为关联数组,因为它的下标既可以是数字也足以是字符串。下标平常被称作key,并且与相应的数组元素的值关联。数组元素的key和值都存储在awk程序内部的一张表中,通过一定散列算法来储存,所以数组元素都不是按顺序存储的。打印出来的逐条也决然不是依照一定的依次,不过大家可以经过管道来对所需的数目再一次操作来达到和谐的作用。
如图简单察觉,awk数组就和旅舍同样。数组的称呼就如饭店名称,数组元素名称似乎客旅社间号码,每个数组元素里面的情节就好像旅馆房间内部的人。
2.5.2 awk中变量的定义简介
-
直白定义,直接使用即可
-
awk中字母会被认为是变量,如若真的要给一个变量赋值字母(字符串),请使用双引号
说明:
不曾公文awk依旧可以处理BEGIN形式下的动作(命令)
2.10 图片-数组
万一大家有一个酒家
酒店<===>chensiqihotel
酒吧里面有多少个屋子110,119,120,114那多少个房间
酒店110房间<===>chensiqihotel[110]
酒店120房间<===>chensiqihotel[120]
酒店119房间<===>chensiqihotel[119]
酒店114房间<===>chensiqihotel[114]
旅舍房间里面入住客人
酒店110房间住着xiaoyu<===>chensiqihotel[110]="xiaoyu"
酒店119房间住着ruxue<===>chensiqihotel[119]="ruxue"
酒店120房间住着dandan<===>chensiqihotel[120]="dandan"
酒店114房间住着waiwai<===>chensiqihotel[114]="waiwai"
示例:
[root@chensiqi ~]# awk 'BEGIN{chensiqihotel[110]="xiaoyu";chensiqihotel[119]="ruxue";chensiqihotel[120]="dandan";chensiqihotel[114]="waiwai";print chensiqihotel[110],chensiqihotel[119],chensiqihotel[120],chensiqihotel[114]}'
xiaoyu ruxue dandan waiwai
[root@chensiqi ~]# awk 'BEGIN{chensiqihotel[110]="xiaoyu";chensiqihotel[119]="ruxue";chensiqihotel[120]="dandan";chensiqihotel[114]="waiwai";for(hotel in chensiqihotel)print hotel,chensiqihotel[hotel]}'
110 xiaoyu
120 dandan
114 waiwai
119 ruxue
商家面试题1:统计域名访问次数
拍卖以下文件内容,将域名取出并按照域名进行计数排序处理:(百度和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
思路:
1)以斜线为菜刀取出第二列(域名)
2)创立一个数组
3)把第二列(域名)作为数组的下标
4)通过类似于i++的形式展开计数
5)计算后把结果输出
经过演示:
率先步:查看一下内容
[root@chensiqi ~]# awk -F "[/]+" '{print $2}' file
www.etiantian.org
www.etiantian.org
post.etiantian.org
mp3.etiantian.org
www.etiantian.org
post.etiantian.org
命令说明:
这是我们需要计数的内容
第二步:计数
[root@chensiqi ~]# awk -F "[/]+" '{i++;print $2,i}' file
www.etiantian.org 1
www.etiantian.org 2
post.etiantian.org 3
mp3.etiantian.org 4
www.etiantian.org 5
post.etiantian.org 6
命令说明:
i++:i最开始是空的,当awk读取一行,i自身+1
其三步:用数组替换i
[root@chensiqi ~]# awk -F "[/]+" '{h[$2]++;print $2,h["www.etiantian.org"]}' file
www.etiantian.org 1
www.etiantian.org 2
post.etiantian.org 2
mp3.etiantian.org 2
www.etiantian.org 3
post.etiantian.org 3
命令说明:
1)将i替换成h[$2];相当于我创建了一个数组h[],然后用$2作为我的房间号。但是目前房间里是没有东西的。也就是说h[$2]=h["www.etiantian.org"] and h["post.etiantian.org"] and h["mp3.etiantian.org"] 但是具体房间里是没有东西的也就是空。
2)h[$2]++就等于i++:也就是说我开始给房间里加东西;当出现同样的东西,我就++
3)print h["www.etiantian.org"]:意思就是说我开始要输出了。我要输出的是房间号为“www.etiantian.org”里面的内容。这里面的内容最早是空的,随着awk读取每一行一旦出现房间号为“www.etiantian.org”的房间时,我就给房间里的内容进行++。
4)综上,输出的结果中,每次出现www.etiantian.org时,h["www.etiantian.org"]就会++。因此最后的输出数字是3
第四步:输出最后计数结果
[root@chensiqi ~]# awk -F "[/]+" '{h[$2]++}END{for(i in h)print i,h[i]}' file
mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
[root@chensiqi ~]#
命令说明:
我们最终需要输出的是去重复以后的统计结果,所以得在END模块里进行输出
for(i in h)遍历这个数组,i里存的都是房间号
print i,h[i]:输出每一个房间号及其房间里的内容(计数结果)
提示:
awk的使用里最要紧的一个作用就是计数,而数组在awk里最大的功能就是去重新。请同学们精心精通,多入手试验弹指间。
2.5.3 END模块
EHD在awk读取完所有的文件的时候,再执行END模块,一般用来输出一个结实(累加,数组结果),也足以是和BEGIN模块类似的尾声标识音信
与BEGIN形式相呼应的END格局,格式一样,但是END情势仅在awk处理完所有输入行后才举办拍卖。
商店案例:统计/etc/servies文件里的空行数量
思路:
a)空行通过正则表达式来贯彻:^$
b)计算数据:
-
grep -c
-
awk
方法一:grep
方法二:
[root@chensiqi files]# awk
‘/^$/{i++}END{print i}’ /etc/services
16
提示:
选拔了awk的技艺作用,很常用
率先步:计算空行个数
/^$/
意味着原则,匹配出空行,然后实施{i++}(i++等于i=i+1)即:/^$/{i=i+1}
咱俩得以因此/^$/{i=i+1;print i}
来查阅awk执行进度
第二步:输出最终结果
-
只是大家只想要最终的结果16,不想要进程如何是好?使用END形式输出结果
-
因为END形式的奇特性质所以很适合输出最终结果
故此最终结果就是awk '/^$/{i=i+1}END{print "blank lines count:"i}' /etc/services
商家面试题5:文件count.txt,文件内容是1到100(由seq
100扭转),请计算文件每行值加起来的结果(总计1+…+100)
思路:
文本每一行都有且只有一个数字,所以大家要让文件的每行内容相加。
抚今追昔一下上一道题我们用的是i++即i=i+1
那里大家需求选拔到首个常用的表明式
i=i+$0
相对而言一下,其实只是把下边的1换成了$0
[root@chensiqi files]# awk '{i=i+$0}END{print i}' count.txt
5050
2.7 awk数组
awk提供了数组来存放一组有关的值。
awk是一种编程语言,肯定也协理数组的行使,不过又不一样于c语言的数组。数组在awk中被称呼关联数组,因为它的下标既可以是数字也得以是字符串。下标寻常被称作key,并且与相应的数组元素的值关联。数组元素的key和值都存储在awk程序内部的一张表中,通过自然散列算法来囤积,所以数组元素都不是按顺序存储的。打印出来的一一也决然不是按照一定的各类,不过大家得以因此管道来对所需的多少重复操作来达到和谐的功用。
如图不难窥见,awk数组就和酒吧同样。数组的称号就好像酒店名称,数组元素名称就好像酒馆房间号码,每个数组元素里面的始末就好像酒店房间内部的人。
2.8 图片-数组
假定大家有一个旅社
酒店<===>chensiqihotel
酒馆里面有几个房间110,119,120,114那多少个屋子
酒店110房间<===>chensiqihotel[110]
酒店120房间<===>chensiqihotel[120]
酒店119房间<===>chensiqihotel[119]
酒店114房间<===>chensiqihotel[114]
酒店房间里面入住客人
酒吧110房间住着xiaoyu<===>chensiqihotel[110]=”xiaoyu”
旅馆119房间住着ruxue<===>chensiqihotel[119]=”ruxue”
饭店120房间住着dandan<===>chensiqihotel[120]=”dandan”
饭馆114屋子住着waiwai<===>chensiqihotel[114]=”waiwai”
示例:
“xiaoyu”
[root@chensiqi ~]# awk ‘
xiaoyu
dandan
waiwai
ruxue
合营社面试题1:统计域名访问次数
拍卖以下文件内容,将域名取出并依照域名进行计数排序处理:(百度和sohu面试题)
)
)
)
思路:
1)以斜线为菜刀取出第二列(域名)
2)创设一个数组
3)把第二列(域名)作为数组的下标
4)通过类似于i++的方式开展计数
5)计算后把结果输出
进度演示:
第一步:查看一下内容
[root@chensiqi ~]# awk -F “[/]+” ‘{print $2}’ file
www.etiantian.org www.etiantian.org post.etiantian.org
mp3.etiantian.org www.etiantian.org
post.etiantian.org
第二步:计数
[root@chensiqi ~]# awk -F “[/]+”
‘{i++;print $2,i}’ file
www.etiantian.org 1
www.etiantian.org 2
post.etiantian.org 3
mp3.etiantian.org 4
www.etiantian.org 5
post.etiantian.org 6
一声令下表达: i++:i最伊始是空的,当awk读取一行,i自身+1
其三步:用数组替换i
[root@chensiqi ~]# awk -F “[/]+” ‘{h[$2]++;print $2,h[“www.etiantian.org”]}’ file
www.etiantian.org 1
www.etiantian.org 2
post.etiantian.org 2
mp3.etiantian.org 2
www.etiantian.org 3
post.etiantian.org 3
指令表达:
1)将i替换成h[$2];相当于自身创造了一个数组h[],然后用$2作为我的房间号。不过近来房间里是不曾东西的。也就是说h[$2]=h[“www.etiantian.org”] and h[“post.etiantian.org”] and h[“mp3.etiantian.org”]
不过切实房间里是尚未东西的也就是空。
2)h[$2]++就极度i++:也就是说自己起来给房间里加东西;当出现相同的事物,我就++
3)print h[“www.etiantian.org”]:意思就是说我起来要出口了。我要出口的是房间号为“www.etiantian.org”里面的内容。这里面的情节最早是空的,随着awk读取每一行一旦出现房间号为“www.etiantian.org”的屋申时,我就给房间里的内容进行++。
4)综上,输出的结果中,每回出现www.etiantian.org时,h[“www.etiantian.org”]就会++。由此最后的出口数字是3
第四步:输出最终计数结果
[root@chensiqi ~]# awk -F “[/]+” ‘{h[$2]++}END{for(i in h)print i,h[i]}’ file mp3.etiantian.org 1
post.etiantian.org 2
www.etiantian.org 3
[root@chensiqi ~]# 命令表达:
我们最终需要输出的是去重新未来的总计结果,所以得在END模块里展开输出
for(i in
h)遍历这些数组,i里存的都是房间号
print
i,h[i]:输出每一个房间号及其房间里的情节(计数结果)
提示:
awk的利用里最重大的一个效用就是计数,而数组在awk里最大的职能就是去重新。