要弄懂awk程序,必须熟悉了解这个工具的规则。本实战笔记的目的是经过实际案例或面试题带同窗们熟练掌握awk在企业中的用法,而不是awk程序的帮助手册linux
一种名字怪异的语言面试
模式扫描和处理正则表达式
awk不只仅时linux系统中的一个命令,并且是一种编程语言,能够用来处理数据和生成报告(excel)。处理的数据能够是一个或多个文件,能够是来自标准输入,也能够经过管道获取标准输入,awk能够在命令行上直接编辑命令进行操做,也能够编写成awk程序来进行更为复杂的运用。本章主要讲解awk命令的运用。shell
记录与字段编程
模式匹配:模式与动做小程序
基本的awk执行过程vim
awk经常使用的内置变量(预约义变量)bash
awk语法:循环,条件运维
awk经常使用函数编程语言
向awk传递参数
awk引用shell变量
awk小程序及调试思路
awk指定是由模式,动做,或者模式和动做的组合组成
模式pattern,能够相似理解成sed模式匹配,能够有表达式组成,也能够是两个正斜杠 / /直接的正则表达式。好比NR==1,这就是模式,能够把它理解为一个条件。
动做action,是由大括号里面的一条或多条语句组成,语句直接使用分号隔开。好比awk使用格式:
awk处理的内容能够来自标准输入< ,一个或多个文本文件或管道。
patter既模式,也能够理解成为条件,也叫找谁,你找谁?高矮,胖瘦,男女?都是条件,既模式。
action既动做,能够理解成干啥,找到人以后要作什么。
模式和动做的详细介绍咱们放在后面部分,如今你们要对awk结构有一个了解。
实例1-1
将/etc/passwd 第2行到第6行 及行号打印出来?
[root@admin /]# awk -F : 'NR==2,NR==6{printNR,$1}' /etc/passwd
2 bin
3 daemon
4 adm
5 lp
6 sync
[root@admin /]# cat /etc/passwd | awk -F :'NR>=2&&NR<=6{print NR,$1}'
2 bin
3 daemon
4 adm
5 lp
6 sync
命令说明:
-F 指定分隔符为冒号:至关于以“:” 为菜刀,进行字段(列)切割
NR==2行, 到 NR==6 这部分是表示模式,是一个条件,表示取第二行到第六行
NR>=2 && NR<=6 条件大于等于2行 而且 小于等于6行
{pirnt NR,$1} 这部分表示动做,要干什么,表示要输出NR行号和$1第一列
[root@admin /]# 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/nologi006E
sync:x:5:0:sync:/sbin:/bin/sync
命令说明:
-F 指定分隔符为冒号:
NR>=2 && NR<=6 这部分是条件,表示取第2行到第6行
注意:可是这里没有动做,这里你们须要了解若是只有条件(模式)没有动做,awk默认输出整行。
[root@admin /]# awk -F : '{print NR,$1}'/etc/passwd
1 root
2 bin
3 daemon
4 adm
5 lp
6 syn
….如下省略
命令说明:
-F 指定分隔符为冒号:
这里没有条件,表示对每一行都处理
{print NR,$1} 表示动做,显示NR行号与$1第一列内容
这里要理解没有条件的时候,awk会处理每一行
[root@admin /]# awk -F : 'NR==1{printNR,$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做解释
awk -F : 'NR==1{print NR,$1}NR==2{print NR,$NF}'/etc/passwd
Pattern模式是可选的。若是不指定,awk将处理输入文件中的全部记录。若是指定一个模式,awk则只处理匹配指定的模式的记录。
{action}动做为awk命令,能够是单个命令,也能够是多个命令。整个action(包括里面的全部命令)都必须放在{和}之间。
action必须被{action} 包裹,没有被{action}包裹就是patern.
file要处理的目标文件。
在深刻了解awk前,咱们须要知道awk如何处理文件的。
实例1-2 示例文件的建立
[root@admin ~]# mkdir /server/files/ -p
[root@admin ~]# head /etc/passwd >/server/files/awkfile.txt
[root@admin ~]# 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-3 示例1-6 awk执行过程演示
[root@admin ~]# 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将处理模式(条件)指定的行
awk读入第一行内容
判断是否符合模式中的条件NR>=2
a) 若是匹配则执行相应的动做{print $0}
b)若是不匹配条件,继续读取下一行
继续读取下一行
重复过程1-3,直到读取到最后一行(EFO;endof file 结束)
接下来我给你们来带两个新概念记录和字段,这里为了方便你们理解能够把记录就当作行及记录==行,字段至关于列。
名称 |
含义 |
record |
记录,行 |
field |
字段,列 |
awk对每一个要处理的输入数据认为都是具备格式和结构的,而不只仅是一堆字符串。默认状况下,每一行内容都是一条记录,并以换行符分隔(\n)结束。
实例1-4 查看一下下面这段文字
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默认状况下每一行都是一个记录(record)
RS及record separator 输入输出数据记录分隔符,每一行是怎么没得,表示每一个记录输入的时候的分隔符,既行与行之间若是分隔. \n
NR既number of record 记录(行号),表示当前正在处理的记录(行)的号码
ORS既output record separator 输出记录分隔符
awk使用内置变量RS来存放输入记录分隔符,RS表示是输入记录分隔符,这个值能够经过BEGIN模块从新定义修改。
实例1-5
[root@admin files]# cat 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@admin 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:
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
看到这个应该明白是怎么回事了吧对比
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(回车换行)结束。而这个行的结束不就是记录分割符RS。
因此在awk中,RS(记录分隔符)变量表示这行的结束符号(默认是回车换行)
在工做中,咱们能够经过修改RS变量的值来决定行的结束标志,最终来决定“每行”的内容
注意:
awk 的BEGIN模块,在后面详解,此处你们知道BEGIN模块里面定义一些awk内置变量便可。
$0表示整行,其实awk使用$0表示整条记录。记录分隔符存在RS变量中,或者说每一个记录以RS内置变量结束。
另外,awk每一行的记录都有一个内置变量NR来保存,没处理完一条记录,NR的值就会自动+1
下面经过实例加深印象
[root@admin 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
命令说明:
NR及number of record ,当前记录的记录号,刚开始学也能够理解为行号。
$0表示整行或者说整个记录
注:(此处使用sort与uniq便可)
命令: sort 排序 uniq 配合sort 将重复的单词等数字的合并
题目:
题目建立方法:
sed -r '1,10s#[^a-zA-Z]+# #g' /etc/passwd>/server/files/count.txt
[root@admin 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
~
思路:
让全部单词排成一列,这样每一个单词都是单独的一行
设置RS值为空格
2)将文件里面的全部空格替换为回车换行符“\n”
3)grep全部连续的字母,grep-o参数让他们排成一列。
方法:将全部字母排成一列
方法一:xargs 分组 将全部字母
[root@admin files]# xargs -n 1 < count.txt
方法二:修改默认的RS记录分隔符 \n 换成空格 这样就会显示一列
[root@admin files]# awk 'BEGIN{RS=""}{print $0}' count.txt
方法三:tr虽然是sed的阉割版可是其功能仍是挺强大的 全部的空格替换成\n换行符 这样就达到咱们想要的效果了 sed是一行一行读入 放在模式空间换不了\n
[root@admin files]# cat count.txt | tr "" "\n"
方法四: egrep将全部字母过滤出来
-o 精确匹配
利用正则表达式 小写a到大写Z
+ 连续重复前面一个字符或多个字符
# cat count.txt | egrep -o "[a-Z]+"
[root@admin files]# xargs -n 1 < count.txt |sort | uniq -c
3 adm
1 bash
5 bin
2daemon
3 halt
2 lp
1 lpd
3 mail
6nologin
3 root
12 sbin
3shutdown
3spool
3 sync
3 uucp
4 var
10 x
[root@admin files]# awk 'BEGIN{RS=""}{print $0}' count.txt | sort | uniq -c
1
3 adm
1 bash
5 bin
2daemon
3 halt
2 lp
1 lpd
3 mail
6nologin
3 root
12 sbin
3shutdown
3spool
3 sync
3 uucp
4 var
10 x
[root@admin files]# cat count.txt | tr " " "\n" | sort | uniq -c
3 adm
1 bash
5 bin
2daemon
3 halt
2 lp
1 lpd
3 mail
6nologin
3 root
12 sbin
3shutdown
3spool
3 sync
3 uucp
4 var
10 x
[root@admin files]# cat count.txt | egrep -o"[a-Z]+" | sort | uniq -c
3 adm
1 bash
5 bin
2daemon
3 halt
2 lp
1 lpd
3 mail
6nologin
3 root
12 sbin
3shutdown
3spool
3 sync
3 uucp
4 var
10 x
NR存放着每一个记录的号(行号)读取新行的时候会自动+1
RS是输入数据的记录的分隔符,简单理解就是制定每一个记录的行的结尾标志\n.
RS做用就是表示一个记录的结束
ORS输出数据的记录的分隔符
大象放冰箱分几步?打开冰箱,把大象放进去,关闭冰箱门。
awk也是同样的,一步一步来,先修改了RS,而后用NR调试,看看到底如何分隔的。而后经过sort排序,uniq -c去重
FS既fieldseparator,输入字段(列)分隔符。分隔符就是菜刀,把一行字符串切为不少个区域。
NF既number offileds,表示一行中(字段)的个数,能够理解为菜刀且过一行后,切成了多少份。
awk使用内置变量FS来记录区域分隔符的内容,FS能够在命令行上经过-F 参数来更改,也能够经过BEGIN模块来更改。'BEGIN{FS=":"}{printNR,$1}'
而后经过$n,n是整数,来取被切割后的区域,$1取第一个区域, $2取第二个区域,$NF取最后一个区域。
下面经过实例来增强学习:
实例1-6 指定分割符:
[root@admin files]# awk -F " " '{print$1}' count.txt
root
bin
daemon
adm
命令说明:
以:(冒号) 为分隔符,打印第一列内容
此处的FS是一个字符,其实他能够指定多个字符,此时FS指定的值能够是一个正则表达式。
正常状况下,当你指定分隔符(非空格)的时候,例如指定多个区域分隔符,每一个分隔符就是一把刀,把左右两边切为两个部分。
实例1-7 同时取出zhaokai和10206334这两个内容。
[root@admin files]# cat qq.txt
I am zhaokai,my qq is 10206334
思路:
咱们用默认的想法一次使用一把刀,须要配合管道的。若是同时使用两把刀呢?看下面的结果
[root@admin files]# awk -F "[ ,]"'{print $3,$NF}' qq.txt
zhaokai 10206334
命令说明:
经过命令-F 参数指定区域分隔符
[, ] 是正则表达式里面的内容,它表示一个总体,一个空格和一个逗号,合并在一块儿,就表示以空格或者逗号为区域分隔符。
小技巧:
在动做(‘{print \$3,\$NF}’)里面的逗号,表示空格,其实动做中的逗号就是OFS的值,咱们会在后面说明。刚开始你们把动做中的都逗号,看成空格便可。
例:默认分隔符和指定分隔符会有些差别
[root@admin files]# ifconfig eth0 | awk 'NR==2'>/server/files/awkblank.txt
[root@admin files]# cat /server/files/awkblank.txt
inet addr:192.168.197.133 Bcast:192.168.197.255 Mask:255.255.255.0
#默认分隔符时候
[root@admin files]# awk '{print $1}'/server/files/awkblank.txt
inet
#指定分隔符时候
[root@admin files]# awk -F "[ :]+"'{print $1}' /server/files/awkblank.txt
[root@admin files]# awk -F "[ :]+"'{print $2}' /server/files/awkblank.txt
inet
命令说明:
awk默认的FS分隔符对于空格序列,一个空格或多个空格tab都认为是同样的,一个总体。
这个文件的开头有不少连续的空格,而后才是inet这个字符
当咱们使用默认的分隔符的时候,$1是有内容的。
当咱们指定其余分隔符(非空格)时候,区域会有所变化
到底为什么会这样,咱们在这里再也不深刻研究,只要了解有这种状况,注意一下便可。
如今说说ORS和OFS这两个内置变量的含义。
RS是输入记录分隔符,决定awk如何读取或分隔每行(记录)
ORS表示输出记录分隔符,决定awk如何输出一行(记录)的,默认是回车换行(\n)
FS是输入区域分隔符,决定awk读入一行后如何再分为多个区域。
OFS表示输出区域分隔符,决定awk输出每一个区域的时候使用什么分隔她们。
awk无比强大,你能够经过RS,FS决定awk如何读取数据。你也能够经过修改ORS,OFS的值指定awk如何输出数据。
修改FS
[root@admin /]# awk 'BEGIN{FS=":"}{print$1}' /etc/passwd
修改RS 记得查看是用NR显示行号比较方便
[root@admin /]# awk 'BEGIN{RS=":"}{print$0}' /etc/passwd
如今你应该会对awk的记录字段有所了解了,下面咱们总结一下,学会给阶段性知识总结是学好运维的必备技能。
RS记录分隔符,表示每行的结束标志,默认是\n
NR行号(记录号)
FS字段分隔符,每列的分隔标志或结束标志
NF就是每行有多少列,每一个记录中字段的数量
$符号就是取某个列(字段),$1$2$NF
FS ( awk -F )分隔符,-F “:”《==》‘BEGIN{FS=":"}’
RS记录分隔符(行的结束标示)
选择合适的刀FS,RS,OFS,ORS
分隔符è结束标示
记录与区域字段,你就对咱们所谓的行与列,有了新的认识。
awk命令行结构
awk的模式和动做
awk的记录和字段
比较核心经常使用的是字段
另外这些企业面试题但是学会awk的必备,必须本身能写出来。
接下来就详细介绍下,awk的模式都有几种
正则表达式做为模式
比较表达式做为模式
范围模式
特殊模式BEGIN和END
awk的模式是你玩好awk必备也是最基础的内容,必须熟练掌握
awk同sed同样也能够经过模式匹配来对输入的文本进行匹配。说到模式匹配,确定少不了正则表达式模式,大部分与sed支持的元字符相似,并且正则表达式是玩转三剑客必备工具,下表列出awk支持的正则表达式元字符:
awk模式就支持正则表达式符号
元字符 |
功能 |
示例 |
解释 |
^ |
字符串开头 |
/^admin/或\$3~/^admin/ |
匹配全部以admin开头的字符串;匹配出全部第三列中以admin开头的 |
\$ |
字符串结尾 |
/admin$/或$3~/admin$/ |
匹配全部以admin结尾的字符串;匹配第三列中以admin结尾的 |
.(点) |
匹配任意但个字符(包括回车符) |
/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开头的行 |
() |
子表达式组合 |
/(admin)+/ |
表示一个或多个cool组合,当有一些字符须要组合时,使用括号括起来 |
| |
或者的意思 |
/(admin)|B/ |
匹配admin或字母B的行 |
awk正则匹配的操做符 |
|
~
|
用于对记录或区域的(行列)表达式进行匹配 awk '$1/zhaokai/{print $1}' test.txt
|
! |
用于表达式与~相反的意思
|
实战例子:
root@admin files]# cat zhaokai.txt | awk'$1~/zhaokai/'
zhaokai like linux
[root@admin files]# cat zhaokai.txt | awk'$1~/zhaokai/{print $1}'
zhaokai
[root@admin files]# awk '/^root/{print $1}'awkfile.txt
root:x:0:0:root:/root:/bin/bash
和上面效果同样
[root@admin files]# awk -F ":"'$0~/^root/' awkfile.txt
root:x:0:0:root:/root:/bin/bash
awk只用正则表达式的时候是默认匹配整行的即‘$0~/^root/’和‘/^root/’是同样的。
打印最后一列 -F 指定分隔符 :
[root@admin files]# awk -F ":"'/^root/{print $NF}' awkfile.txt
/bin/bash
[root@admin files]# awk -F ":"'$5~/shutdown/' awkfile.txt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
提示:
$5表示第五个区域(列)
~表示匹配(正则表达式匹配)
/shutdown/表示匹配shutdown这个字符串
合并在一块儿
$5~/shutdown/表示第五个区域(列)匹配正则表达式/shutdown/,既第5列包含shutdown这个字符串,则显示这一行。
^匹配一个字符串的开头|
$匹配一个字符串的结尾|
在sed和grep这两个命令中,咱们都把它们看成行的开头和结尾。可是在awk中它表示的是字符串的开头和结尾
[root@admin files]# vim 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
~
第一列是姓氏
第二列是名字
第一列第二列合起来就是姓名
第三列是对应的ID号码
最后三列是三次捐款数量
练习题1:显示姓Zhang的人的第二次捐款金额及她的名字
练习题2:显示Xiaoyu的名字和ID号码
练习题3:显示全部以41开头的ID号码的人的全名和ID号码
练习题4:显示全部以一个D或X开头的人名全名
练习题5:显示全部ID号码最后一位数字是1或5的人的全名
练习题6:显示Xiaoyu的捐款,每一个值都有以$开头。如$520$200$135
练习题7:显示全部人的全名,以姓,名的格式显示,如Meng,Feixue
方法一:必须掌握
[root@admin files]# awk -F "[ :]+"'$1~/^Zhang/{print $1,$5}' reg.txt
Zhang 100
Zhang 90
方法二:
[root@admin files]awk -F "[ :]+"'$1~/^Zhang/{print $2,$(NF-1)}' reg.txt
/Zhang/ 条件 这一行中若是有Zhang知足条件
第一列 或者以Zhang 开头并结尾
说明:
-F 指定分隔符,如今知道-F 及FS也是支持正则表达式的。
[: ]+ 表示连续空格或冒号 +重复一个或一个以上前面的字符。
/Zhang/ 表示条件,整行中包含Dan字符的这个条件
{print $1,$5}表示动做,知足条件后,执行显示第一列和第五列
注意:
NF是一行中有多少列,NF-1整行就是倒数第二列。
$(NF-1)就是取倒数第二列内容。
方法一:必须掌握
[root@admin files]# awk '$2~/Xiaoyu/{print $1,$3}'reg.txt
Zhang 390320151
方法二:
[root@admin files]# awk -F "[ :]+"'$2~/^Xiaoyu/{print $1,$3}' reg.txt
命令说明:
指定分隔符-F “【:】+”
$2~/Xiaoyu/表示条件,第二列包含Xiaoyu时候执行对应的动做
{print $1,$3}表示动做,显示第一列和第三列的内容
思路:
[root@oldboyedu-35 files]# ###第一个里程碑-肯定好目标并选好武器
[root@oldboyedu-35 files]# ###第二里程碑-- 肯定好条件 找谁
[root@oldboyedu-35 files]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu-35 files]#
[root@oldboyedu-35 files]# ###第三个里程碑-只显示你想要的内容
方法以:
[root@admin files]# awk '$3~/^41/{print $1,$2,$3}'reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
第一步:肯定好目标
第二步:肯定好条件 找谁
第三步:显示你想要的内容
方法一:
[root@admin files]# awk '$2~/^[DX]/{print $1,$2}'reg.txt
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
方法二:
[root@admin files]awk -F "[ :]+"'$2~/^D|^X/{print $1,$2}' reg.txt
Zhang Dandan
Zhang Xiaoyu
Wang Xiaoai
命令说明:
^以什么开头
| 或
注意:
这里要用[ ]括号表示即^[DX]至关于^D|^X,有的同窗写成^D|X这样是错误的。
#和第三题类型
方法一:
[root@admin files]# awk '$3~/[15]$/{print $1,$2}'reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法二:
[root@admin files]awk -F "[ :]+"'$3~/1$|5$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
方法一:
awk -F "[ :]+" '$2~/Xiaoyu/{print"$"$4"$"$5"$"$6}' reg.txt
方法二:awk替换强大功能
[root@admin files]# awk'/Xiaoyu/{gsub(/:/,"$");print $4}' reg.txt
$155$90$201
[root@oldboyedu-35 files]# ###awk内置的功能(函数)
[root@oldboyedu-35 files]# ####查找 替换 gsub
[root@oldboyedu-35 files]# ####gsub(/找谁/,"替换成什么")
[root@oldboyedu-35 files]# ####gsub(/找谁/,"替换成什么",替换那个部分)
方法一:
[root@admin 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
方法二:
[root@admin files]awk -F "[ ]+" '{print$1","$2}' reg.txt
awk功能很强大,玩会了很牛逼。