不占星对后悔的Linux三杀手之awk实战精讲,Linux三

第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)结束

快快跳转目录:

* 第1章:awk基础入门
* 1.1:awk简介 * 1.2:学完awk你可以掌握: * 1.3:awk环境简介 * 1.4:awk的格式
* 1.5:模式动作 * 1.6:awk的执行过程 * 1.6.1:小结awk执行过程 * 1.7:记录和字段
* 1.7.1:记录(行) * 1.7.2:记录分隔符-RS * 1.7.3:对$0的认识 * 1.7.4:企业面试题
* 1.7.5:awk记录知识小结 * 1.7.6:字段(列) * 1.7.7:ORS与OFS简介 * 1.9:awk基础入门总结
* 第2章:awk进阶
* 2.1:awk模式与动作 * 2.2:正则表达式作为模式 * 2.2.1:awk正则匹配操作符 * 2.2.2:awk正则表达式匹配整行
* 2.2.3:awk正则表达式匹配一行中的某一列 * 2.2.4:某个区域中的开头和结尾 * 2.2.5:创建测试环境 * 2.2.6:测试文件说明
* 2.2.7:awk正则表达式练习题 * 2.2.8:awk正则表达式练习题-详解 * 2.2.9:企业面试题 * 2.2.10:明明白白扩展正则表达式: (加号)
* 2.2.11:awk正则之{} -花括号 * 2.2.12:企业案例1 * 2.2.13:企业案例2 * 2.3:比较表达式做为模式-需要一些例子
* 2.3.1:企业面试题 * 2.3.2:如果判断某一列是否等于某个字符呢? * 2.4:范围模式 * 2.5:awk特殊模式-BEGIN模式与END模式
* 2.5.1:BEGIN模块 * 2.5.2:awk中变量的概念简介 * 2.5.3:END模块 * 2.6:awk中的动作
* 2.7:awk模式与动作小结 * 2.8:总结awk执行过程
* 2.9:awk数组 * 2.10:图片-数组

一、Linux三剑客之awk命令精讲

1.1.1 QX56S    记录分隔符   每一的完成标识暗许是回车

[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笔录分隔符-LacrosseS

第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记录(行)号,表示近来正在管理的记录(行)的号子
ORubiconS即output record separator输出记录分隔符

awk使用内置变量安德拉S来存放输入记录分隔符,途胜S代表的是输入的笔录分隔符,那个值能够通过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
陆风X8S=行分隔符(记录分隔符)
O奥德赛S=输出记录分隔符
FS=字段分隔符(列分隔符)
OFS=输出字段分隔符
$0=整个记录
NF= 列数
NR= 行数
在{print ,}中,逗号的意思是OFS
BEGIN:主要用以定义内置变量.

1.2 学完awk你能够操纵:

  1. 记录与字段
  2. 情势相称:情势与动作
  3. 主干的awk施行进程
  4. awk常用内置变量(预订义变量)
  5. awk数组(职业常用)
  6. awk语法:循环,条件
  7. awk常用函数
  8. 向awk传递参数
  9. awk引用shell变量
  10. 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的格局相配,能够由表明式组成,也得以是八个正斜杠之间的正则表达式。举例N智跑==1,那便是格局,能够把她了然为叁个尺度。
  • 动作即action,是由在大括号里面包车型大巴一条或多条语句组成,语句之间采纳分号隔断。举个例子awk使用格式:

图片 1

awk处理的内容能够来自职业输入(<),二个或七个公文文件或管道。

图片 2

  • pattern既形式,也足以知晓为基准,也叫找什么人,你找哪个人?高矮,胖瘦,男女?都以标准,既情势。
  • action既动作,能够清楚为干啥,找到人自此您要做什么样。
    方式和动作的详实介绍大家放在尾巴部分,未来我们先对awk结构有三个询问。

1.3 awk的格式

  • awk指令是由格局,动作,或然情势和动作的结合组成。

  • 形式既pattern,能够临近掌握成sed的方式相配,能够由表明式组成,也足以是三个正斜杠之间的正则表明式。譬如N景逸SUV==1,那就是格局,能够把他精晓为二个标准化。

  • 动作即action,是由在大括号里面包车型客车一条或多条语句组成,语句之间接选举取分号隔离。举个例子awk使用格式:

图片 3

  • 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记录知识小结:

  1. N卡宴(number of record)贮存着各样记录的号(行号)读取新行时候会活动 1
  2. 宝马7系S(record separator)是输入数据的记录的分隔符,老妪能解正是足以内定各类记录的结尾标识
  3. 本田UR-VS功效就是意味着叁个记录的了断
  4. 当我们修改了SportageS的值,最佳合作NENCORE(行)来查阅变批,也正是修改了奥迪Q5S的值通过NGL450查看结果,调节和测量试验awk程序
  5. OCRUISERS输出数据的记录的相间符

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必得被{ }包裹,未有被{ }包裹的就是Patern

  • 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的值

ENVISIONS=行分隔符(记录分隔符)
OLANDS=输出记录分隔符
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)剖断是不是合乎格局中的条件N途睿欧>=2

a,假诺协作则实行相应的动作{print $0}
b,假若不合营原则,继续读取下一行

3)继续读取下一行
4)重复进度1-3,直到读取到结尾一行(EOF:end of file)

图片 4

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(饱含O凯雷德S)都不会卓有成效。
之所以大家要求让awk知道$0被改变了,那四个事情。
$1=$1是把$1的值赋值给$1,那肯定不会修改任何内容,不过那一个动作会通报awk笔者修改了$1的剧情,所以重复修改print $0的时候,$0的原委就更换了。
那是三个小技艺

1.7.2 记录分隔符-帕JeroS

图片 5

  • awk私下认可景况下每一行都是二个笔录(record)
  • CRUISERS既record separator输入输出数据记录分隔符,每一行是怎么没的,表示种种记录输入的时候的分隔符,既行与行之间什么分隔。
  • N凯雷德既number of record 记录(行)号,表示方今正值处理的笔录(行)的号码。
  • O奥迪Q5S既output record separator 输出记录分隔符。

awk使用内置变量大切诺基S来贮存在输入记录分隔符,TiggoS表示的是输入的记录分隔符,这一个值能够由此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中,奥迪Q5S(记录分隔符)变量表示着行的利落符号(暗许是回车换行)

在职业中,大家得以由此改换XC90S变量的值来决定行的甘休标识,最终来调控“每行”的从头到尾的经过。
为了便利大家理解,awk暗中同意就把TiggoS的值设置为“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)设置CRUISERS值为空格
2)将文件之中的装有空格替换为回车换行符“n”
3)grep全数连接的假名,grep -o参数让他俩排成一列。

图片 6

 

1.5.1 格式  

gsub(/要替换的源委/,"替换来什么",替换的一对)

2.5 awk特殊形式-BEGIN形式与END情势

1.7.3 对$0的认识

  • 如1.7.2的例证,能够观望awk中$0表示整行,其实awk使用$0来代表整条记录。记录分隔符存在PRADOS变量中,大概说各类记录以兰德XC90S内置变量停止。
  • 别的,awk对每一行的记录号都有三个放到变量N奥迪Q5来保存,每管理完一条记下,NTucson的值就能自行 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的笔录字段有所掌握了,下边我们总计一下,学会给阶段性知识计算是学好运营的至关重大工夫。

  • 瑞鹰S记录分隔符,表示每行的利落标识

  • NR行号(记录号)

  • FS字段分隔符,每列的相间标记或终止标识

  • NF就是每行有个别许列,每一个记录中字段的数目

  • $符号表示取某个列(字段),$1$2$NF

  • NF代表记录中的区域(列)数量,$NF取最终二个列(区域。)

  • FS(-F)字段(列)分隔符,-F(FS)“:”<==>‘BEGIN{FS=':'}’

  • 奇骏S 记录分隔符(行的终止标志)

  • NR 行号

  • 选好合适的刀FS(***),RS,OFS,ORS

  • 相隔符==>截止标记

  • 笔录与区域,你就对大家所谓的行与列,有了新的认知(库罗德S,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, 库罗德S),能够出口表头(类似excel表格名称)
BEGIN形式在此之前大家有在演示中关系,自定义变量,给内容变量赋值等,都施用过。要求注意的是BEGIN方式前面要接跟三个action操作块,包涵在大括号内。awk必需在对输入文件举办别的管理前先进行BEGIN里的动作(action)。大家得以不要别的输入文件,就足以对BEGIN模块进行测量试验,因为awk须求先实践完BEGIN方式,才对输入文件做管理.BEGIN情势常常被用来修改内置变量O帕杰罗S,福特ExplorerS,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)设置哈弗S值为空格
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记录知识小结

  1. NQX56寄放着每一种记录的号(行号)读取新行时候会自行 1
  2. LacrosseS是输入数据的记录的分隔符,老妪能解便是能够钦赐每一种记录的末段标识。
  3. EvoqueS效率正是意味一个笔录的终止
  4. 当大家修改了奥迪Q3S的值,最佳合营N奔驰G级(行)来查看变化,也正是修改了宝马X5S的值通过NPAJERO查看结果,调试awk程序。
  5. O昂科雷S输出数据的笔录的相间符

awk学习本事一则:
小象放三门双门电冰箱分几步?张开双门电冰箱,把大象放进去,关闭双门冰箱门。
awk也是一模一样的,一步一步来,先修改了本田UR-VS,然后用N本田UR-V调节和测量试验,看看毕竟怎么着分隔的。然后经过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 字段(列)

  • 每条记下都是由五个区域(田野同志)组成的,默许景况下区域之间的相间符是由空格(即空格或制表符)来分隔,并且将分隔符记录在松手变量FS中,每行记录的区域数保存在awk的嵌入变量NF中。

图片 7

  • FS既田野(field)separator,输入字段(列)分隔符。分隔符正是菜刀,把一行字符串切为相当多少个区域。
  • NF既number of fileds,表示一行中列(字段)的个数,可以看到为菜刀切过一行后,切成了稍稍份。

OFS输出字段(列)分隔符

  • awk使用内置变量FS来记录区域分隔符的内容,FS能够在指令行上通过-F参数来改动,也能够经过BEGIN模块来改动。
  • 接下来通过$n,n是整数,来取被切割后的区域,$1取第七个区域,$2取第1个区域,$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简介

当今说说OKoleosS和OFS那三个放置变量的意思。

  • 奥德赛S是输入记录分隔符,决定awk怎么着读取或分隔每行(记录)
  • OLX570S代表输出记录分隔符,决定awk怎么样输出一行(记录)的,暗中认可是回车换行(n)
  • FS是输入区域分隔符,决定awk读入一行后怎么样再分为多个区域。
  • OFS代表输出区域分隔符,决定awk输出每个地区的时候利用什么分隔她们。
  • awk无比强盛,你能够透过凯雷德S,FS决定awk怎么着读取数据。你也能够经过修改O景逸SUVS,OFS的值钦赐awk怎样输出数据。

图片 8

 

1.7 相比表明式

$5>500                第五列大于500

NR>20                 大于第20行的行,20行以后

>  

>=

==

!=                    不等于

<=

< 

4.1 总计从Nokia到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的笔录字段有所掌握了,下边大家总计一下,学会给阶段性知识总结是学好运转的必得技术。

图片 9

  • 奥迪Q5S记录分隔符,表示每行的扫尾标识
  • NR行号(记录号)
  • FS字段分隔符,每列的相间标记或截止标记
  • NF正是每行有微微列,每种记录中字段的数目
  • $符号表示取某个列(字段),$1$2$NF
  • NF表示记录中的区域(列)数量,$NF取最终二个列(区域。)
  • FS(-F)字段(列)分隔符,-F(FS)“:”<==>‘BEGIN{FS=':'}’
  • QX56S 记录分隔符(行的截至标记)
  • NR 行号
  • 选好合适的刀FS(***),RS,OFS,ORS
  • 相隔符==>甘休标志
  • 记录与区域,你就对大家所谓的行与列,有了新的认知(大切诺基S,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 呈现出磁盘使用率大于33.33%的磁盘分区名称和挂载点(错误轨范)

[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.结束
思想:

  1. awk主题情想正是先拍卖,然后END模块输出。(累积(a ;a =$0),awk数组)
  2. BEGIN模块用于awk内置变量FS,LANDS的赋值,打字与印刷标题头的新闻。(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)
    

    }

第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等方法。

大旨须求输出五个目的: 【访谈次数】 【访谈次数*单个文件大小】 【文件名(能够带U中华VL)】

[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动作

print

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 创制测验景况

图片 10

说明:

  • 率先列是姓氏

  • 第二列是名字

  • 首先列第二列合起来就是真名

  • 其三列是相应的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的人的第二回捐款金额及他的名字

图片 11

说明:

  • -F内定分隔符,现在大家知晓了-F即FS也是扶助正则表明式的。

  • 【 :】 表示延续的空格或冒号

  • -F “【 :】 ” 以延续的空格或冒号为分隔符

  • /Zhang/表示原则,整行中带有Dan字符的这一个条件。

  • {print $1,$(NF-1)} 表示动作,满足条件后,实施展现第一列($1)和尾数第二列($(NF-1))当然$5也足以。

注意:
NF是单排中有多少列,NF-1整行正是倒数第二列。
$(NF-1)正是取倒数第二列内容。

示范2:呈现Xiaoyu的姓氏和ID号码

图片 12

演示3:突显全部以41从头的ID号码的人的全名和ID号码

图片 13

示例4:突显全数以贰个D或X带头的人名全名

图片 14

注意:
此间要用()括号表示即^(D|X)相当于^D|^X,有的同学写成^D|X那样是不当的。

示范5:展现全部ID号码最终壹位数字是1或5的人的姓名

图片 15

示例6:展现Xiaoyu的捐款,种种值都有以$初阶。如$520$200$135

图片 16

示例7:显示全部人的真名,以姓,名的格式呈现,如Meng,Feixue

图片 17

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的行

图片 18

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文件:

图片 19

从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行

思路:
想表示四个限量,一个行的范围,就要选择N奥迪Q5那些放手变量了,同时也要用到相比表明式。

答案:

[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)NGL450代表行号,大于等于23即,N中华V>=23紧跟于等于30,即N奥德赛<=30
3)合起来正是N凯雷德>=23相同的时间NEvoque<=30,&&表示还要,同期创造的意趣。
4)换一种表明式方法正是超乎22行小于31行,即N奥德赛>22&&N奥迪Q3<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行

思路:
想表示贰个限制,贰个行的限制,就要接纳NLAND那个松手变量了,同一时间也要用到比较表达式。

答案:

[root@www ~]# awk 'NR>=23&&NR<=30' /etc/services

[root@www ~]# awk 'NR>22&&NR<31' /etc/services

说明:

1)相比较表达式相比较常用的依旧表示大于等于,小于等于照旧等于,根据这几个例子来上学就可以
2)N翼虎代表行号,大于等于23即,N昂科威>=23稍差于等于30,即N卡宴<=30
3)合起来正是N福特Explorer>=23还要NLX570<=30,&&表示还要,同时组建的野趣。
4)换一种表明式方法便是出乎22行小于31行,即NQX56>22&&N中华V<31

2.4 范围方式

pattern1 pattern2
从哪里来 哪里去
条件1 条件2
  • 限制形式老妪能解就是从哪儿来,到何地去。
  • 相称从标准1起来到条件2介绍的限量

1)还记得sed使用地方范围来管理公事内容嘛?awk的限量方式,与sed类似,可是又有例外,awk不可能一向运用行号来作为限制早先地址,因为awk具备内置变量NXC90来积累记录号,全体须求利用NENVISION=1,NTiguan=5那样来选用。
2)界定方式管理的法规是:先匹配从第多个方式的第叁次出现到第4个形式的第4回出现之间的内容,施行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

说明:
法规是:从第二行,到第五行
动作是:展现行号(NGL450)和整行($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,LX570S),能够出口表头(类似excel表格名称)
  • BEGIN模式此前大家有在演示中提到,自定义变量,给内容变量赋值等,都选取过。要求小心的是BEGIN格局前面要接跟一个action操作块,富含在大括号内。awk必需在输入文件举行任哪个地点理前先实践BEGIN里的动作(action)。大家得以不要其他输入文件,就足以对BEGIN模块进行测量试验,因为awk需求先实践完BEGIN格局,才对输入文件做拍卖。BEGIN格局平时被用来修改内置变量O途锐S,本田UR-VS,FS,OFS等值。

2.3.2 要是推断某一列是还是不是等于有些字符呢?

示范:寻找/etc/passwd中第五列是root的行

测量检验文件:

图片 20

答案:

图片 21

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)第3个成效,在读取文件从前,输出些提示性音信(表头)。

[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具备内置变量NPAJERO来囤积记录号,全体要求使用N奥迪Q5=1,N锐界=5这样来利用。
2)限定情势管理的准则是:先相称从第多个形式的第四回现身到第4个方式的第叁次出现之间的剧情,实践action。然后相配从第三个方式的下贰遍面世到第2个形式的下贰次面世,直到文本停止。假使相称到第三个格局而并没有相称到第三个格局,则awk管理从第一个形式带头直到文本结束全数的行。倘诺第二个格局不宽容,就算第二个方式相称,awk照旧不管理别的行。

awk '/start pos/,/end pos/{print $)} passwd chensiqi'
awk '/start pos/,NR==XXX{print $0}' passwd chensiqi

限定方式的时候,范围条件的时候,表明式必得能合营一行。

图片 22

说明:
标准是:从第二行,到第五行
动作是:展现行号(NENVISION)和整行($0)
合起来就是突显第二行到第五行的行好和整行的剧情

示例2:

图片 23

说明:
原则是:从以bin伊始的行,到第五行
动作是:呈现行号和整行内容
合起来正是展现从以bin初步的行,到第五行中的行号和整行内容。

示例3:

图片 24

说明:
规范化:从第五列以bin早先的行到以lp早先的行
动作:呈现行号和正航内容
合起来:从第三列以bin开始的行到以lp开首的行并展现其行号和整行内容

图片 25

说明:
规范:从第三列以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编制程序观念:

  1. 先拍卖,最终再END模块输出
  2. {print NR,$0}body模块处理,管理实现后
  3. 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,HighlanderS),能够输出表头(类似excel表格名称)

  • BEGIN形式在此之前我们有在示范中涉嫌,自定义变量,给内容变量赋值等,都应用过。必要在意的是BEGIN方式前面要接跟三个action操作块,包蕴在大括号内。awk必须在输入文件实行别的处理前先实施BEGIN里的动作(action)。大家得以不要任何输入文件,就能够对BEGIN模块举行测量检验,因为awk须要先进行完BEGIN格局,才对输入文件做拍卖。BEGIN格局日常被用来修改内置变量OTiguanS,EnclaveS,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地址

答案:

图片 26

2)第4个效果与利益,在读取文件在此以前,输出些提醒性新闻(表头)。

图片 27

说明:
要在首先行输出一些username和UID,我们理应想到BEGIN{}这一个极其的尺度(方式),因为BEGIN{}在awk读取文件从前推行的。
故此结果是BEGIN{print "username","UID"},注意print命令里面双引号吃什么吐什么,原样输出。
下一场我们落到实处了在出口文件内容前边输出“username”和“UID”,下一步输出文件的首先列和第三列即{print $1,$3}
谈到底结果就是BEGIN{print "username","UID"}{print $1,$3}

3)第一个职能,使用BEGIN模块的奇怪性质,举行部分测量试验。

图片 28

2.8 计算awk推行进程

回想一下awk的结构

awk -F 钦命分隔符 ‘B本田UR-VGIN{}END{}’,如下图

图片 29

#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情势中定义了牧马人S内置变量,在终极经过END形式输出了结果

 

2.9 awk数组

awk提供了数组来寄存在一组有关的值。
awk是一种编制程序语言,确定也帮助数组的选拔,可是又不相同于c语言的数组。数组在awk中被誉为关联数组,因为它的下标既可以够是数字也足以是字符串。下标平日被称作key,何况与相应的数组成分的值关联。数组成分的key和值都存款和储蓄在awk程序内部的一张表中,通过自然散列算法来积累,所以数组成分都不是按顺序存款和储蓄的。打字与印刷出来的顺序也必定不是遵从一定的相继,可是大家得以通过管道来对所需的数量再度操作来实现本人的效率。

图片 30

如图轻易开掘,awk数组就和小吃摊同一。数组的名号就像饭店名称,数组元素名称就像是旅社房间编号,种种数组成分里面包车型客车剧情就像酒馆房间内部的人。

2.5.2 awk中变量的定义简要介绍

  • 向来定义,直接行使就可以

  • awk中字母会被感觉是变量,假诺真的要给三个变量赋值字母(字符串),请使用双引号

图片 31

说明:
尚无公文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模块类似的末段标记音讯

图片 32

与BEGIN方式相对应的END方式,格式一样,可是END情势仅在awk管理完全体输入行后才开展管理。

商城案例:总计/etc/servies文件里的空行数量

思路:
a)空行通过正则表明式来促成:^$
b)计算数据:

  • grep -c

  • awk

方法一:grep

图片 33

方法二:

[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实践进度

图片 34

其次步:输出最终结果

  • 只是大家只想要最后的结果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程序内部的一张表中,通过自然散列算法来存款和储蓄,所以数组元素都不是按顺序存款和储蓄的。打字与印刷出来的各种也一定不是遵守一定的逐一,不过大家得以由此管道来对所需的数码再一次操作来达到本人的功效。

图片 35

 

如图轻便察觉,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里最大的效应正是去重新。

本文由星彩网app下载发布于星彩网app下载,转载请注明出处:不占星对后悔的Linux三杀手之awk实战精讲,Linux三

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。