三剑客之awk,awk综合脚本应用

作者: 策略游戏排行  发布:2019-09-11

三徘徊花之awk

一、使用awk提取文本

第1章 awk简介

目标:

1.1 awk简介

  • 一种名字古怪的言语。
  • 方式扫描和拍卖。管理文本流,水流。

awk不唯有是linux系统中的一个限令,并且是一种编程语言,能够用来拍卖数量和转变报告。

拍卖的数量能够是三个或四个公文,能够是根源专门的工作输入,也能够透过管道获取标准输入,awk能够

在命令行上直接编辑命令进行操作,也足以编写成awk程序来进展更为复杂的施用。这里主要批注

awk命令行的行使。

学完本章你会询问:

  • 域(字段)与记录
  • 形式与协作
  • 主导的awk施行进程
  • awk常用内置变量(预订义变量)
  • awk数组(专门的学业中相比较常用)

再有一部分任何awk用法:(这里不作介绍)

  • awk语法:循环,条件
  • awk常用函数:print
  • 向awk传递参数
  • awk引用shell变量
  • awk编程

 

本案例供给运用awk工具完结下列过滤职分:

1.2 awk蒙受简单介绍

[root@linux-node1 ~]# cat /etc/redhat-release

CentOS release 6.6 (Final)

 

[三剑客之awk,awk综合脚本应用。root@linux-node1 ~]# uname -r

2.6.32-504.el6.x86_64

 

[root@linux-node1 ~]# awk --version

GNU Awk 3.1.7

 

[root@linux-node1 ~]# which awk

/bin/awk

#/bin下和/sbin下的一声令下差别:

/bin : commands in this dir are all system installed user commands    系统的部分下令

/sbin:  commands in this dir are all system installed super user commands  一流客商指令 系统一管理理命令,这里贮存的是系统一管理理员使用的治本程序 

/usr/bin: user commands for applications  中期安装的部分软件的运营脚本

/usr/sbin: super user commands for applications  一级客户的局地管制造进程序

 

 

    1> 演练awk工具的宗旨用法
    2> 提取本机的IP地址、根分区使用率
    3> 格式化输出/etc/passwd文件中的顾客名、UID、宿主目录新闻

1.3 awk的格式

awk指令是由形式,动作,可能方式和动作的组成组成。

形式既pattern,能够临近驾驭成sed的情势相称,可以由表达式组成,也足以是五个正斜杠之间的正则表达式。举例N奥迪Q7=1,那就是格局,能够把她清楚为二个口径。

动作即action,是由在大括号里面包车型大巴一条或多条语句组成,语句之间用分号隔离。如awk使用格式:

 图片 1

 

图1-1 awk命令行格式

awk管理的内容能够来自专门的职业输入(<),壹个或几个文本文件或管道。

图片 2

 

图1-2 awk形式动作解释图

pattern既情势,也得以明白为标准,也叫找何人,你找什么人?高矮,胖瘦,男女?都以基准,既情势。

action 既动作,能够领会为干啥,找到人事后您要做哪些。

 

格式化输出passwd文件内容时,要求首先行事列表标题,最终一行提醒一共已管理公事的分局数,如下图所示。

1.4 awk试行进度

在深远摸底awk前,大家要求知道awk怎么着管理公事的。

演示1-1 示范文件的创立

[root@linux-node1 ~]# mkdir -p /server/files/

[root@linux-node1 ~]# head /etc/passwd > /server/files/awkfile.txt

[root@linux-node1 ~]# 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@linux-node1 ~]# 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

 

[root@linux-node1 ~]# awk 'NR>=2{print NR,$0}' /server/files/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

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

awk是由此一行一行的拍卖文件,那条命令中富含方式部分(条件)和动作部分(动作),awk将拍卖情势钦定的行。

小结awk推行进程:

a)awk读入第一行内容

b)剖断符合格局中的条件(N汉兰达>=2)

l 假使相配暗许则推行相应的动作({print $0})

l 假设不包容原则,继续读取下一行

c))继续读取下一行

d)重复进度a-c,直到读取到结尾一行(EOF:end of file)

 

                                 图片 3

 1.5 区域和记录

名称

含义

field

域,区域,字段

record

记录,默认一整行

eg:$1,$2,$3,$NF

$0: 整行,贰个记下

$ 取 引用

 

1.5.1 字段(区域)

每条记下都以由五个字段(田野先生)组成的,暗中同意情状下里面包车型客车相间符是由空白符(即空格或制表符)来分隔,而且将分隔符记录在放权变量FS中。每行记录的字段数保存在awk的停放变量NF中。

 

 

图1-4 awk区域分隔符

awk使用内置变量FS来记录字段分隔符的剧情,能够通过BEGIN语句来改动,也足以在指令行上通过-F参数来改造,上面通过示范来拉长学习。

示范1-3  FS演示文件生成

[root@linux-node1 ~]# awk -F ":" 'NR>=2&&NR<=5{print $1,$3}' /server/files/awkfile.txt

bin 1

daemon 2

adm 3

lp 4

1.5.2记录

awk对每种要管理的输入数据人为皆以怀有格式和结构的,而不只是一批字符串。暗许境况下,每一行内容都改为一条记下,并以换行符甘休。

 

² 暗许情况 -一行==一个记录,每行都以三个记录。

² WranglerS ==》 record separator 每个记录读入的时候的分隔符。

² NKoleos==》 number of record 行号,记录的数。awk当前拍卖着的,记录的数。

² O本田CR-VS==》 output record separate 输出食肉的相间符

 

awk使用内置变量来存放记录分隔符,锐界S代表的是输入的笔录分隔符,那么些值也足以以特定的秘诀修改。

前方大家讲到过的$0,awk使用$0来表示整条记录。记录分隔符n保存在大切诺基S变量中。其它awk对每一行的记录号皆有一个放权变量N传祺来保存,每管理完一条记下NPRADO的值就能够自动 1.

上边通过演示来加强一下什么是记录,记录分隔符。

示范1-5 NLX570记录行号

[root@linux-node1 files]# awk '{print NR,$0}' 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

 

演示1-6 福睿斯S记录分隔符

#以/为分隔符记录一行

[root@linux-node1 files]# awk 'BEGIN{RS="/"}{print NR,$0}' 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

三剑客之awk,awk综合脚本应用。12 adm:

13 sbin

14 nologin

lp:x:4:7:lp:

15 var

16 spool

17 lpd:

18 sbin

19 nologin

#以:为分隔符记录一行

[root@linux-node1 files]# awk 'BEGIN{RS=":"}{print NR,$0}' awkfile.txt  

1 root

2 x

3 0

4 0

5 root

6 /root

7 /bin/bash

bin

8 x

9 1

10 1

11 bin

12 /bin

13 /sbin/nologin

daemon

14 x

15 2

16 2

17 daemon

18 /sbin

19 /sbin/nologin

adm

20 x

21 3

22 4

23 adm

24 /var/adm

25 /sbin/nologin

lp

26 x

27 4

28 7

29 lp

30 /var/spool/lpd

31 /sbin/nologin

awk 眼中的公文,原原本本一段连接的字符串,恰巧中间略微n(回车换行符)

 

示例1-7 RS为空值

#LacrosseS为空值的时候将点名行输出为一行

[root@linux-node1 files]# awk 'BEGIN{RS=""}{print NR,$1,$2,$3}' awkfile.txt  

 

 

说明:

在行首打印输出记录号,并打字与印刷出每一行$0的开始和结果

 

厂家案例1:总计文件中各样单词的双重数量

[root@linux-node1 files]# sed -ri.bak 's#[:/0-9]三剑客之awk,awk综合脚本应用。 # #g' awkfile.txt

1)单词弄成一列(排队)

其间 -o 表示“only-matching 正确相称

[root@linux-node1 files]# egrep -o "[a-zA-z] " awkfile.txt |sort| uniq -c|sort -r

      5 x

      5 sbin

      4 nologin

      4 bin

      3 root

      3 adm

      2 var

      2 lp

      2 daemon

      1 spool

      1 lpd

      1 bash

2)统计

[root@linux-node1 files]# awk 'BEGIN{RS="() | n"}{print $0}' awkfile.txt|sort |uniq -c|sort -rn

      5 x

      5 sbin

      4 nologin

      4 bin

      3 root

      3 adm

      2 var

      2 lp

      2 daemon

      1 spool

      1 lpd

      1 bash

      1

 

商厦案例2: 总结文件中各样字母的重新数量

 

记录小结:

  1. 小象放三门双门电冰箱分几步?张开双门三门电冰箱,把大象放进去,关闭智能冰箱门。
  2. 多用N本田UR-V,NF,$数字,同盟你举行调节和测量检验awk命令。
  3. N景逸SUV寄存着各类记录的号(行号)读取新行时候会活动 1
  4. 凯雷德S是记录的分隔符,轻巧理解正是能够钦赐每一种记录的结尾标识。
  5. (用RS替换三剑客之awk,awk综合脚本应用。n)
  6. LANDS作用就是意味七个记下的扫尾。
  7. FS标记着每个地区的停止。

步骤:

1.6 格局相配

1.6.1 正则表达式

awk帮忙的正则表明式元字符

元字符

功能

示例

解释

^

字符串开头

/^cool/

合营全数以cool开头的字符串

$

字符串结尾

/cool$/

合作全数以cool结尾的字符串

.

合作自便单个字符

(满含回车符)

/c..l/

相配字母c,然后八个随机字符,再以l结尾的行,举例ckk1,c@#1等

*

相配0个或四个前导字符

/a*cool/

相配0个或多个a之后紧跟着cool的行,比方cool,aaacool

双重贰遍或壹次以上

/a b/

般配三个或多少个a加b的行

相称0个或一个指导字符

/a?b/

匹配b或ab的行

[]

特出钦点字符组内的任二个字符

/^[abc]/

合营以字母a或b或c起头的行

[^]

相称不在钦命字符组

/^[^abc]/

 相配不以字母a或b或c初叶的行

x{m}

x重复m次

x重复至少m次

x重复至少m次,但不超越n次

亟待钦定参数:--posix大概--re-interval

/(cool){5}

急需留神的一点是,cool加括号或不加括号的分别,x能够使字符串也得以只是贰个字符,全数/cool{5}/表示相称coo再加上5个l,即coolllll,

^(cool){2,}则意味着相配coolcool,

coolcoolcool等

x{m,}

/(cool){2,}/

 

/(cool){5,6}/

正则表明式的施用,暗中同意是在行内查找相配的字符串,若有特别则试行action操作,然则有的时候仅供给一定的列来合营钦点的正则表明式,举个例子:$3这一列查找相称tom的行,那样就必要别的四个至极操作符:

~:用于对记录或字段的表明式进行(匹配)

!~:用于表明与~主张的野趣。(不相配)

#相配 第五列以l可能a开始的兼具行 ,这里(l|a) 能够换到[al]

[root@linux-node1 files]# awk '$3三剑客之awk,awk综合脚本应用。~/^(l|a)/{print $0}' awkfile.txt

adm x adm var adm sbin nologin

lp x lp var spool lpd sbin nologin

#取eth0 ip

[root@linux-node1 files]# ifconfig eth0| awk -F "[ :] " 'NR==2{print $4}'

10.0.0.7

[root@linux-node1 files]# ifconfig eth0| awk -F "addr:| Bcast:" 'NR==2{print $2}'  

10.0.0.7

[root@linux-node1 files]# echo "-----=====1#######2"

-----=====1#######2

[root@linux-node1 files]# echo "-----=====1#######2"|grep "[-=#]"

-----=====1#######2

[root@linux-node1 files]# echo "-----=====1#######2"|grep -o "[-=#]"

-

-

-

-

-

=

=

=

=

=

#

#

#

#

#

#

#

[root@linux-node1 files]# echo "-----=====1#######2"|egrep -o "[-=#] "

-----=====

#######

 

 

 

#匹配o出现三次照旧一回的行打字与印刷第一列和最后一列

[root@linux-node1 files]# awk --posix '$1~/o{1,2}/{print NR,$1,$NF}' awkfile.txt

1 root bash

3 daemon nologin

1.6.2比较表明式

示例1-18

[root@linux-node1 files]# awk 'NR>=2&&NR<=5{print NR,$0}' awkfile.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

1.6.3限量情势

awk ‘/start pos/,/end pos/{print $0} ‘ test.txt

awk ‘/start pos/,NR==XXX{print $0}’ passwd.oldboy

限定方式的时候,范围条件的时候,表明式必需协作一行,

[root@linux-node1 files]# awk 'NR==2,NR==5{print NR,$1,$3}' awkfile.txt

2 bin bin

3 daemon daemon

4 adm adm

5 lp lp

[root@linux-node1 files]# awk 'NR==2,NR==5{print NR,$0}' awkfile.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

[root@linux-node1 files]# awk 'NR==2,NR<=5{print NR,$0}' awkfile.txt  

2 bin x bin bin sbin nologin

1.6.4商号案例:收取常用服务端口号

ftp http https mysql ssh 端口号 /etc/services 文件

[root@linux-node1 files]# awk -F "[ /] " '$1~/ftp|https|mysql|ssh)$/{print $1,$2}' /etc/services|uniq

小结:

  1. 模式===》条件
  2. 正则表明式
  3. 规范表明式(NOdyssey>=2 NLAND==2)
  4. 限定说明式
  5. (NR==2,NR==5)
  6. /正则表达式-开端/,/正则甘休/
  7. $1~/正则表明式-初叶/,$3~/正则截至/ 行,记录。
  8. 区域:FS刀分隔的,FS区域分隔符
  9. 记录:奥迪Q5S刀分隔的,HavalS记录分隔符
  10. FS===>NF 区域的数目
  11. 瑞鹰S===>N大切诺基 记录号,随着记录的加码N君越自动 1

 

 

1.7 awk布局的回想

1.7.1 BEGIN模块

BEGIN格局以前大家有在演示中提到,自定义变量,给内容变量赋值等,都是用过。必要注意的是BEGIN格局后边要接跟三个action操作块,包括在大括号内。awk必需在对输入文件进行其余管理前先实施BEGIN定义的action操作块。大家得以不要其他输入文件,就能够对BEGIN模块进行测验,因为awk须要先执行完BEGIN情势,菜对输入文件做拍卖。BEGIN形式平日被用来修改内置变量OPRADOS,宝马X3S,FS,OFS等的值。

示例1-25

[root@linux-node1 files]# awk 'BEGIN{print "this is begin!nand thiscommand donnot have file"}'

this is begin!

and thiscommand donnot have file

说明:

从没有过公文awk依旧能够拍卖BEGIN方式下的操作块。

1.7.2 END模块

END 在awk读取完全部的文件的时候

awk编制程序思想:

1.先管理,最终再END模块输出。

与BEGIN情势相对于的END格局,格式一样,可是END情势仅在awk管理完全数输入行后才开展管理。况兼在END格局下awk不合作任何输入行。

1.7.3 总括awk实施进度

1.读入一行

2.肯定是不是是要求的行 条件$3>15 满意当先15 实施action :print

3.不满意条件重复1,2手续

1.7.4 集团案例3:总括文件之中的空行数量

[root@linux-node1 files]# grep -c "^$" /etc/services

16

[root@linux-node1 files]# awk '/^$/{a=a 1;print a}' /etc/services  

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[root@linux-node1 files]# awk '/^$/{a=a 1}END{print a}' /etc/services             

16

 

 head -20 /etc/passwd >awkfile2.txt

面试题:awkfile2.txt 里面 以:为分隔符,区域3大于15行,一共有稍许个?

[root@linux-node1 files]# awk -F ":" '$3>15{print $0}' awkfile2.txt   

nobody:x:99:99:Nobody:/:/sbin/nologin

dbus:x:81:81:System message bus:/:/sbin/nologin

usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin

vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin

rpc:x:32:32:Rpcbind Daemon:/var/cache/rpcbind:/sbin/nologin

rtkit:x:499:497:RealtimeKit:/proc:/sbin/nologin

#测算二遍,输出一遍

[root@linux-node1 files]# awk -F ":" '$3>15{a=a 1;print a}' awkfile2.txt           

1

2

3

4

5

6

#处理完文件从此再输出a   这里a=a 1 能够用a 取代

[root@linux-node1 files]# awk -F ":" '$3>15{a=a 1;}END{print a}' awkfile2.txt        

6

百货店面试题5:1 ..... 100 1加到100的值,用awk达成

root@linux-node1 files]# seq 100 > test.txt  

[root@linux-node1 files]# cat test.txt |awk '{a =$0}END{print a}'

5050

[[root@linux-node1 files]# awk 'a=a $0;END{print a}' test.txt |sed -n '$p'

5050

1.7.4 集团案例4:

搜索情况变量$PATH中,全部唯有多个随机字符的授命,举例tee,并将他们重定向到command.txt中,供给一行显示1个,并在文书尾巴部分计算他们的个数.

 

[root@linux-node1 files]# find $(echo $PATH|tr ":" " ") -type f -name "???"| awk '{a }END{print "result:"a}'

find: `/root/bin': No such file or directory

result:75

通配符:用来合营文件名的。{}字符连串

正则表明:字符串

1.7.5 总括awk实践进度

 

[root@linux-node1 files]# awk -F ":" 'BEGIN{print FS}'        

:

先实践命令再实行BEGIN模块

 

 

思想:

  1. awk核心思想正是现管理,然后END模块输出。(累加(a ;a =$0),awk数组)
  2. BEGIN模块用于awk内置变量FS,福睿斯S的赋值,打字与印刷标题头的新闻,(excel表格里面标题行)
  3. END模块用来最终输出,总计音讯,awk数组新闻。
  4. 区域,记录

 

  1. BEGIN和END模块只好有叁个。不可能BEGIN{}BEGIN{}也许END{}END{}
  2. 找何人干啥模块,能够是八个。

NR=2{print $1}NR=5{print $0}

手续一:awk文本过滤的宗旨用法

1.8awk内置变量(预约义变量)

 

变量名

属性

$0

当前记录

$1-$n

当前记录的第n个字段,字段间由FS分隔

FS

输入字段分隔符 默认是空格

NF

当前记录中的字段个数。就是有多少列

NR

已经读出的记录数,就是行号,从1开始

RS

输入的记录分隔符默认为换行符

OFS

输出字段分隔符 默认也是空格

ORS

输出的记录分隔符,默认为

FNR

当前文件的读入记录号

 

1.9 awk数组

身体力行1-9数组演示

array[b]=”aaa”:array.....

 

 

1.9.1合营社面试题1

 

拍卖以下文件内容,将域名收取并依附域名举办计数排序管理(去重):(百度和sohu面试题)

[root@linux-node1 files]# cat awkfile3.txt

http://post.etiantian.org/2.html

 

[root@linux-node1 files]# awk -F "/" '{array[$3] }END{for(key in array) print key,array[key]}' awkfile3.txt

mp3.etiantian.org 1

post.etiantian.org 2

www.etiantian.org 3

 

[root@linux-node1 files]# awk -F "/ " '{array[$2] }END{for(key in array)print key,array[key]}'  awkfile3.txt

mp3.etiantian.org 1

post.etiantian.org 2

www.etiantian.org 3

小结:

 

  1. awk数组去重
  2. 选好分隔符 -F “/”
  3. 选好管理的区域,print $1,$3,$2
  4. array[$3]
  5. 先拍卖,最终END模块输出
  6. 输出awk数组我们使用for(key in array)
  7. ===>for ()循环
  8. key in array 手去框里,抓苹果。
  9. key 正是苹果名字(数组成分的名字)
  10. array数组名(框的名字)
  11. 打印输出print key,array[key]

 

1.9.2 集团案例2总结各样IP的采访量

access_awk.log

 

1.10 awk有关斯洛伐克共和国(The Slovak Republic)语计算

名称

含义

filed

域,区域,字段

record

记录,默认一整行

Filed Separator

FS:区域分隔符,表示一个区域的结束,字段,域

Number of Filed

NF:每一个记录中区域的数量

Record Separator

RS:记录分隔符,表示每个记录的结束

output filed separator

OFS

output Record Separator

ORS

awk当前处理的文件的记录号

FNR

[root@linux-node1 files]# seq 20 30 >20-30.txt

[root@linux-node1 files]# seq 50 60 >50-60.txt

[root@linux-node1 files]# awk '{print FNR,NR,$0}' 20-30.txt 50-60.txt

1 1 20

2 2 21

3 3 22

4 4 23

5 5 24

6 6 25

7 7 26

8 8 27

9 9 28

10 10 29

11 11 30

1 12 50

2 13 51

3 14 52

4 15 53

5 16 54

6 17 55

7 18 56

8 19 57

9 20 58

10 21 59

11 22 60

1)基本操作方法

第2章awk总结:

 

2.1.找哪个人干啥模块

 图片 4

图片 5

 

 

 

 

 

 

 

 

格式:awk [选项] '[条件]{编辑指令}' 文件

2.2awk施行进度-完全

 图片 6

 

BEGIN模块输出一些提示性文字。awk内置变量FS,翼虎S,OCRUISERS,OFS。

END 模块输出一些提示性文字,展现最终的结果,计算空行,awk数组,去苹果的长河把苹果显得管理。

awk里面包车型客车平凡变量不用开首化。

awk先管理,一行一行的管理,然后END模块输出。

  1. 域与记录

FS钦命有滋有味的刀(正则表示),昂科威S正则表明

 

  1. 格局相称===》条件 如何找人。

正则表明式

^字符串早先

$字符串结尾

$3~/^http$/

--posix或 --re-interval

r{n,m}

合作准确,模糊

NR==1

NR>=2

形式暗中同意相配 一行$0

$3~/^r/

awk ‘$3~/[4-6]/{print $0}’ passwd.txt

限制相称

NR=2,NR=5   ==>2,5p

/start 地点/,/结束地点/

 

  1. 相遇正则表明式/ /
  2. $3~/reg/
  3. > = <
  4. N本田CR-V==2,N卡宴=5 /start地点/,/甘休地方/

 

  1. awk数组

数组 ==>元素

一个筐==》苹果

图片 7

图片 8

图片 9

 

 

 

主题材料来源:

http://edu.51cto.com/course/course_id-4319.html

 

 

3. 考试题

考察题1:管理以下文件内容,将域名抽取并依靠域名举行计数排序管理:(百度和sohu面试题)

oldboy.log

答案 (4种)

#这里的

root@linux-node1 files]# awk -F "/" '{array[$3] }END{for(key in array) print key,array[key]}' awkfile3.txt

[root@linux-node1 files]# awk -F "/ " '{array[$2] }END{for(key in array)print key,array[key]}'  awkfile3.txt

[root@linux-node1 files]#  cut -d / -f3 awkfile3.txt|sort|uniq -c|sort -nrk2

[root@linux-node1 files]#  sort -t / -rk3 awkfile3.txt|awk -F / '{print $3}'|uniq -c

 

考试题2:总计集团工作中高并发web服务器分歧互联网连接状态对应的数据

[root@linux-node1 files]# netstat -ant|awk 'NR>=3{array[$6] }END{for(key in array)print key,array[key]}'              

TIME_WAIT 134

SYN_SENT 1

ESTABLISHED 5

LISTEN 10

 

[root@linux-node1 files]# netstat -ant|awk '{print $6}'|uniq -c|sort -nr

    138 TIME_WAIT

      7 LISTEN

      5 ESTABLISHED

      3 LISTEN

      1 Foreign

      1 established)

考试题3.剖析图片服务日志,把日志(种种图片访谈次数*图片大小的总额)排名,取top10,也便是总计各样url的总访谈大小【附加题:加分题】。

评释:本题生产情状应用:那个效应能够用于IDC网址流量带宽非常高,然后经过解析服务器日志哪些因素占用流量过大,进而举行优化或裁剪该图片,压缩js等方法。

焦点必要输出多个目的: 【访问次数】    【访问次数*单个文件大小】   【文件名(能够带U索罗德L)】

测验数据

59.33.26.105 - - [08/Dec/2010:15:43:56 0800] "GET /staticphotos/2.jpg HTTP/1.1" 200 11299 "" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:43:56 0800] "GET /staticphotos/2.jpg HTTP/1.1" 200 11299 "" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:44:02 0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583 "" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

124.115.4.18 - - [08/Dec/2010:15:44:15 0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"

 

答案:

[root@linux-node1 files]# awk 'BEGIN{print"URL:""t""num:t""total_size:"}{a[$7] ;b[$7]=$10}END{for(key in a)print key"t"a[key]"t"a[key]*b[key]}' images.log  

URL:    num:    total_size:

/?=     1       46232

/static/js/web_js.js    1       4460

/staticphotos/2.jpg     2       22598

/static/flex/vedioLoading.swf   1       3583

/static/js/jquery.lazyload.js   1       1627

明白透上述难点并消除后,你将能够轻巧解决如下扩张的考察题:

扩大考试题1:

4.假诺现行反革命有个文件,格式如下:

a  1

b  3

c  2

d  7

b  5

a  3 

g  2

f  6

d  9

即侧边是随机字母,左侧是轻巧数字,必要写个脚本使其出口格式为:

a  4

b  8

c  2

d  16

f  6

g  2

快要相同的字母前面包车型客车数字加在一同,按字母的逐个输出。

答案:

答案

[root@linux-node1 files]# awk '{if(! a[$1] )b[ n]=$1;c[$1] =$2}END{for(i=1;i<=n;i )print b[i],c[b[i]]}' a.txt

a 4

b 8

c 2

d 16

g 2

f 6

庞大考试题2:用shell管理以下内容

1、按单词出现频率降序排序!

2、按字母出现频率降序排序!

the squid project provides a number of resources to assist users design,implement and support squid installations. Please browse the documentation and support sections for more infomation

1.答案

[root@linux-node1 files]# sed -r 's#,| #n#g' b.txt|awk '{array[$0] }END{for(key in array) print array[key],key}'|sort -r          

2 the

2 support

2 squid

2 and

1 users

1 to

1 sections

1 resources

1 provides

1 project

1 of

1 number

1 more

1 installations.

1 infomation

1 implement

1 for

1 documentation

1 design

1 browse

1 assist

1 a

1 Please

1

 

 

 

2.答案

[root@linux-node1 files]# sed 's#[a-zA-Z]#& #g' b.txt|awk 'BEGIN{RS=" "}{arr[$1] }END{for(i in arr) print arr[i],i}'|sort -nr     

25

19 s

17 e

16 o

14 t

12 n

11 r

11 i

9 a

8 u

7 p

7 d

6 m

4 l

4 c

3 f

2 q

2 h

2 b

1 w

1 v

1 j

1 g

1 P

1 .

1 ,i

 

其间,print 是最常用的编纂指令;若有多条编写制定指令,可用分号分隔。

 

管理公事时,若未钦命分隔符,则暗中同意将空格、制表符等作为分隔符。

 

直白过滤文件内容:

    [root@svr5 ~]# awk '{print $1,$2}' /etc/rc.local      //输出文件的第1、2列
    #!/bin/sh
    #
    # This
    # You
    # want
    touch /var/lock/subsys/local

组合管道过滤命令输出:

    [root@svr5 ~]# uname -a                              //日常的欧洲经济共同体输出
    Linux svr5.tarena.com 2.6.18-348.el5 #1 SMP Wed Nov 28 21:22:00 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
    [root@svr5 ~]# uname -a | awk '{print $1,$3,$12}'      //输出第1、3、12字段
    Linux 2.6.18-348.el5 x86_64

2)选项 -F 可钦定分隔符

截取/etc/passwd文件的前7行,用来创立贰个测量试验文件,操作如下:

    [root@svr5 ~]# head -7 /etc/passwd > passwd.txt
    [root@svr5 ~]# cat passwd.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

出口passwd.txt文件中以分集团分隔的第1、7个字段,展现的不等字段之间以逗号隔绝,操作如下:

    [root@svr5 ~]# awk -F: '{print $1","$7}' passwd.txt
    root,/bin/bash
    bin,/sbin/nologin
    daemon,/sbin/nologin
    adm,/sbin/nologin
    lp,/sbin/nologin
    sync,/bin/sync
    shutdown,/sbin/shutdown

或者:

    [root@svr5 ~]# awk -F ":" '{print $1","$7}' passwd.txt
    root,/bin/bash
    bin,/sbin/nologin
    daemon,/sbin/nologin
    adm,/sbin/nologin
    lp,/sbin/nologin
    sync,/bin/sync
    shutdown,/sbin/shutdown

awk还识别各类单个的字符,例如以“:”或“/”分隔,输出第1、拾二个字段:

    [root@svr5 ~]# awk -F [:/] '{print $1,$10}' passwd.txt
    root bash
    bin nologin
    daemon nologin
    adm sbin
    lp
    sync sync
    shutdown shutdown

输出每趟管理的行号,以及当前行以“:”分隔的字段个数:

    [root@svr5 ~]# awk -F: '{print NR,NF}' passwd.txt
    1 7
    2 7
    3 7
    4 7
    5 7
    6 7
    7 7

4)awk管理的火候

awk会逐行管理公事,扶助在管理第一行以前做一些备选工作,以及在管理完最后一行之后做一些计算性质的劳作。在命令格式上各自展现如下:

    行前管理,BEGIN{ }
    逐行管理,{ }
    行后甩卖,END{ }

上述编辑指令段可以包含在一对单引号内,比如:

   awk  [选项]  ' BEGIN{编辑指令 } {编辑指令} END{编辑指令}'  文件

只做预管理的时候,能够未有操作文件,举个例子:

    [root@svr5 ~]# awk 'BEGIN{A=1024;print A*2.56}'
    2621.44

举个饱含四个管理时机的事例——“总结类别中央银行使bash作为登入Shell的客商总个数:预管理时赋值变量x=0,然后逐行读入/etc/passwd 文件检查,假诺发掘登陆Shell是/bin/bash则x扩充1,全体管理完结后,输出x的值就能够。相关操作及结果如下:

    [root@svr5 ~]# awk 'BEGIN{x=0}/<bash$/{x } END{print x}' /etc/passwd
    29

当然,这些事例比较轻易(效果与egrep -c '<bash$' /etc/passwd 同样),此处仅仅是用来证实awk两种处理机遇的用法。在骨子里职业中,利用awk的这种管理流程能够做到非常多更复杂的任务。

手续二:利用awk提取本机的IP地址、根分区使用率

1)提取IP地址

分步落到实处的思路及操作参谋如下——

经过ifconfig eth0查看网卡消息,在这之中囊括IP地址:

    [root@svr5 ~]# ifconfig eth0
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:82:09:E9
              inet 192.168.4.4  Bcast:192.168.4.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe82:9e9/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:358524 errors:0 dropped:0 overruns:0 frame:0
              TX packets:230638 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:44470760 (42.4 MiB)  TX bytes:64236279 (61.2 MiB)

重组grep得到包括IP地址的那一行:

    [root@svr5 ~]# ifconfig eth0 | grep "inet"
              inet addr:192.168.4.4  Bcast:192.168.4.255  Mask:255.255.255.0

再组成awk过滤出第2列:

    [root@svr5 ~]# ifconfig eth0 | grep "inet" | awk '{print $2}'
    192.168.4.4

2)提取根分区使用率

分步落到实处的思绪及操作参谋如下——

经过df命令查看根分区的利用景况,其中包罗使用率:

    [root@svr5 ~]# df -hT /
    文件系统         类型     体积     已用     可用     已用%     挂载点
    /dev/sda2     ext3     19G         7.2G     11G         40%         /

输出上述结果中最后一行的第6列:

    [root@svr5 ~]# df -hT / | tail -1 | awk '{print $6}'
    40%

手续三:格式化输出/etc/passwd文件

1)任务要求及贯彻思路剖析

依照任务须求的结果,输出的剧情囊括多个部分:列表头、客商音讯、列表尾。

是因为/etc/passwd文件中的客户记录是纯净的以“:”分隔,何况恰好awk本人就已经支撑“前、中、后”三段式管理,所以用awk处理是再妥善不过了。通过awk的嵌入变量N凯雷德就能够获取管理的笔录行数,因此假如设置科学的输出就能够。

2)依据兑现思路编写、验证awk过滤语句

输出信息时,能够利用“t”显示Tab制表位:

    [root@svr5 ~]# awk -F: 'BEGIN{print "UsertUIDtHome"}
    {print $1"t"$3"t"$6} END{print "Total "NR" lines."}' /etc/passwd
    User    UID     Home
    root    0       /root
    bin     1       /bin
    daemon  2       /sbin
    adm     3       /var/adm
    lp      4       /var/spool/lpd
    sync    5       /sbin
    .. ..
    iamkiller       1234    /opt/.private/iamkiller
    nsd001  0       /home/nsd001
    nsd002  1236    /home/nsd002
    nsd003  1237    /home/nsd003
    postfix 89      /var/spool/postfix
    Total 67 lines.

二、awk管理规范

目标:

此案例供给运用awk工具达成下列过滤任务,注意awk管理标准的安装:

    1> 列出UID间于501~505的客商详细消息
    2> 输出/etc/hosts文件内以127或192起始的笔录
    3> 列出100以内整数中7的翻番或是含7的数

步骤:

手续一:认知awk管理原则的安装

创制测量试验文件passwd.txt文件:

    [root@svr5 ~]# head -7 /etc/passwd > passwd.txt
    [root@svr5 ~]# cat passwd.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

1)使用正则表明式设置标准

输出个中以bash结尾的完好记录:

    [root@svr5 ~]# awk -F: '/bash$/{print}' passwd.txt
    root:x:0:0:root:/root:/bin/bash

出口以a、b、c或d初步的客户名、宿主目录:

    [root@svr5 ~]# awk -F: '/^[a-d]/{print $1,$6}' passwd.txt
    bin /bin
    daemon /sbin
    adm /var/adm

输出个中客商名以a开头、登入Shell以nologin结尾的顾客名、登入Shell:

    [root@svr5 ~]# awk -F: '/^a|nologin$/{print $1,$7}' passwd.txt
    bin /sbin/nologin
    daemon /sbin/nologin
    adm /sbin/nologin
    lp /sbin/nologin

出口在那之中宿主目录以bin结尾(对第6个字段做~相称)的客户名、宿主目录音讯:

    [root@svr5 ~]# awk -F: '$6~/bin$/{print $1,$6}' passwd.txt
    bin /bin
    daemon /sbin
    sync /sbin
    shutdown /sbin

出口个中登陆Shell不以nologin结尾(对第7个字段做!~反向匹配)的客户名、登陆Shell新闻:

    [root@svr5 ~]# awk -F: '$7!~/nologin$/{print $1,$7}' passwd.txt
    root /bin/bash
    sync /bin/sync
    shutdown /sbin/shutdown

2)使用数值/字符串相比较设置标准

出口第3行(行号N哈弗等于3)的客户记录:

    [root@svr5 ~]# awk -F: 'NR==3{print}' passwd.txt
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

输出奇数行(行号NHaval除以2余数为1)的顾客记录:

    [root@svr5 ~]# awk -F: 'NR%2==1{print}' passwd.txt
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

输出偶数行(行号NEnclave除以2余数为0)的顾客记录:

    [root@svr5 ~]# awk -F: 'NR%2==0{print}' passwd.txt
    bin:x:1:1:bin:/bin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync

输出前3行文本:

    [root@svr5 ~]# awk -F: 'NR<=3{print}' passwd.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

输出从第5行发轫到文件末尾的全体行:

    [root@svr5 ~]# awk -F: 'NR>=5{print}' passwd.txt
    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

出口客商名字为“sync”的行:

    [root@svr5 ~]# awk -F: '$1=="sync"{print}' passwd.txt
    sync:x:5:0:sync:/sbin:/bin/sync

本文由bg游戏资讯发布于策略游戏排行,转载请注明出处:三剑客之awk,awk综合脚本应用

关键词: 操作系统 OS X 策略游戏排行 linux

上一篇:KTV点歌系统
下一篇:没有了