新的一周又开始了,我们的正则表达式也讲完了!不过这个课后可能需要发更多的时间来消化,多练习!
首先我们还是回顾一下上次课程内容,复习一下grep sed。
1.题目:把英文字母全部删除
[root@localhost ~]# cat test.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
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@localhost ~]# sed 's/[a-zA-Z]//g' test.txt //将所有的字母替换掉了
::0:0::/://
::1:1::/://
::2:2::/://
::3:4:://://
::4:7::///://
::5:0::/://
::6:0::/://
::7:0::/://
::8:12::///://
::11:0::/://
::12:100:://://
2.题目:在某一行的行首或行尾增加内容
2.1 在匹配字符行首,行首增加字符
[root@localhost ~]# sed '/hello/s/^/woare /' 2.txt //在hello前面增加woare
woare hello world
we are the people
made in china
2.2 在匹配某个字符前面加入内容
[root@localhost ~]# sed 's/in/knight & /' 2.txt//在匹配in字符前面增加knight
hello world
we are the people
made knight in china
2.3 在匹配某个行,在某个字符后面增加字符
[root@localhost ~]# sed 's/in/& knight /' 2.txt
hello world
we are the people
made in knight china
2.4在匹配某一行前面增加一行
[root@localhost ~]# sed '/we/i knight' 2.txt //在匹配we这一行前面增加一行knight
hello world
knight
we are the people
made in china
2.5 在匹配某一行的行尾增加相关字符
[root@localhost ~]# sed '/made/s/$/ knight/' 2.txt
hello world
we are the people
made in china knight
2.6 在匹配某一行的后面增加一行
[root@localhost ~]# sed '/made/a knight' 2.txt
hello world
we are the people
made in china
knight
3. awk
3.1 awk其实是一门编程语言,它支持条件判断、数组、循环等功能。所以,我们也可以把awk理解成一个脚本语言解释器。
3.2 awk的基本语法格式:awk -F ':' 'BEGIN{语句} {if(条件){语句1;语句2;语句3} } END{语句}' filename
3.3awk 主要参数
$0 表示整个当前行
$1 每行第一个字段
NF 字段数量变量
NR 每行的记录号,多文件记录递增
FNR 与NR类似,不过多文件记录不递增,每个文件都从1开始
\t 制表符
\n 换行符
FS BEGIN时定义分隔符
RS 输入的记录分隔符, 默认为换行符(即文本是按一行一行输入)
~ 匹配,与==相比不是精确比较
!~ 不匹配,不精确比较
== 等于,必须全部相等,精确比较
!= 不等于,精确比较
&& 逻辑与
|| 逻辑或
+ 匹配时表示1个或1个以上
/[0-9][0-9]+/ 两个或两个以上数字
/[0-9][0-9]*/ 一个或一个以上数字
FILENAME 文件名
OFS 输出字段分隔符, 默认也是空格,可以改为制表符等
ORS 输出的记录分隔符,默认为换行符,即处理结果也是一行一行输出到屏幕
-F'[:#/]' 定义三个分隔符
3.4 awk实例:
3.4.1 将passwd文件打印第一段
[root@localhost ~]# awk -F ':' '{print $1}' test.txt
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
注意: 如果awk忽略了-F,默认将会以空格、空白字符为分隔符去打印
3.4.2 指定字符分割,不用空格,例如使用#
[root@localhost ~]# awk -F ':' '{print $1"#"$2"#"$3}' test.txt
root#x#0
bin#x#1
daemon#x#2
adm#x#3
lp#x#4
sync#x#5
3.4.3 匹配含有某个字符的第一段
[root@localhost ~]# awk -F ':' '$1~/oo/' test.txt
root:x:0:0:root:/root:/bin/bash
3.4.4 awk也支持正则多个表达式一起
[root@localhost ~]# awk -F ':' '/root/ {print $1} /sbin/ {print $3}' test.txt
root
1
2
3
4
5
6
7
8
3.4.5 条件操作符
[root@localhost ~]# awk -F ':' '$3>1000' test.txt
user1:x:1001:1001::/home/user1:/bin/bash
双引号的含义
[root@localhost ~]# awk -F ':' '$3>"1000"' test.txt
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
operator:x:11:0:operator:/root:/sbin/nologin
加上双引号”“之后,相当于sort不加-n。就代表1000不再是数字,而是一个字符串,是以ASSIC码计算的。
3.4.6 字段之间相互比较
[root@localhost ~]# awk -F ':' '$3<$4 {print $1}' test.txt
adm
lp
mail
games
ftp
3.4.7 OFS 指定打印后的分隔符
[root@localhost ~]# awk -F ':' '{OFS="#"} $3>1000 {print $1}' test.txt
user1
3.4.8 NR 表示行 NF 表示段 //将前面9行的最后一段打印出来
[root@localhost ~]# awk -F ':' 'NR<10 {print $NF}' test.txt
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
3.4.9 求第三段所有值之和
[root@localhost ~]# awk -F ':' '{tot=tot+$3}; END {print tot}' test.txt
4606
4. 扩展知识
4.1 把一个目录下,过滤所有*.php文档中含有eval的行
grep -r --include="*.php" 'eval' /data/