2018-8-21 课堂笔记

新的一周又开始了,我们的正则表达式也讲完了!不过这个课后可能需要发更多的时间来消化,多练习!

首先我们还是回顾一下上次课程内容,复习一下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/

猜你喜欢

转载自blog.csdn.net/a1779078902/article/details/81937394