环境准备:
[root@oldboyedu oldboy]# cat oldboy.txt
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
2.1 ^ 以…开头的行
案例:以my开头的行
[root@oldboyedu oldboy]# grep '^my' oldboy.txt
my blog is http: blog.51cto.com
my qq num is 593528156
2.2 $ 以…结尾的行
案例:以156结尾的行
[root@oldboyedu oldboy]# grep '156$' oldboy.txt
my qq num is 593528156
cat-Afile#显示文件中隐藏的标记[root@oldboyedu oldboy]# cat -A oldboy.txt
I am lizhenya teacher!$
I teach linux.$
test$
$
I like badminton ball ,billiard ball and chinese chess!$
my blog is http: blog.51cto.com $
our site is http:www.lizhenya.com $
our site is http:www.lizhenua.com $
my qq num is 593528156$
$
aaaa,$
not 572891888887.$
^^^^^^^^66$$$$$$$^^^$$$
lizhenyalizhenyalizhenya$
案例:显示以m 结尾的行
[root@oldboyedu oldboy]# grep 'm $' oldboy.txt
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
排除空行
[root@oldboyedu oldboy]# grep -v '^$' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
2.4 . (点) 任意一个字符
注意 . 不匹配空行
[root@oldboyedu oldboy]# grep '.' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
2.5 \ 转义字符 -脱掉马甲打回原形,去除原有特殊含义
匹配出以 . 结尾的行
[root@oldboyedu oldboy]# grep '\.$' oldboy.txt
I teach linux.
not 572891888887.
转义字符序列
\n 回车键
\t tab键
2.6 * 前一个字符连续出现0次或者0次以上
案例:8连续出现0次或者0次以上
[root@oldboyedu oldboy]# grep '8*' oldboy.txt
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
[root@oldboyedu oldboy]# grep '\^*' oldboy.txt
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
2.7 .* 所有内容、任何内容、任意内容
整体记忆 . 表示所有*
理解:.表示任意一个字符 * 表示前一个字符连续出现0次或者0次以上
匹配全部内容
[root@oldboyedu oldboy]# grep '.*' oldboy.txt
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
案例:
[root@oldboyedu oldboy]# grep '^.*t' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
not 572891888887.
案例:任意开头到第一个o结束的行
正则表达式特色:正则表达式的贪婪性。*表示所有或者*连续出现的时候表现出尽可能贪婪匹配
2.8 灵异的2* 8*
为什么多匹配了内容?
[root@oldboyedu oldboy]# grep '8*' oldboy.txt
I am lizhenya teacher!
I teach linux.
testI like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya## 8* 表示数字8出现了0次或者是0次以上。出现0次意思是什么都没有,这时候会把所有内容显示出来
2.9 [] [abc] 1次匹配任何一个字符(a或b或c)
[root@oldboyedu oldboy]# grep '[abc]' oldboy.txt
I am lizhenya teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
aaaa,
lizhenyalizhenyalizhenya[a-z]#所有小写字母[A-Z]#大写字母[0-9]#数字[a-Z0-9]#所有大小写字母和数字grep-i[a-z0-9]#所有大小写字母和数字
案例:匹配文件中的大小写字母和数字
[root@oldboyedu oldboy]# grep '[a-zA-Z0-9]' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
[a-z|A-Z|0-9] 匹配大小写字母和数字和|
2.10 [^] [^abc] 取反,排除 排除a或b或c .匹配a或b或c以外的内容
案例:除了a或b或c以外的内容
[root@oldboyedu oldboy]# grep '[^abc]' oldboy.txt
I am lizhenya teacher!
I teach linux.
test
I like badminton ball ,billiard ball and chinese chess!
my blog is http: blog.51cto.com
our site is http:www.lizhenya.com
our site is http:www.lizhenua.com
my qq num is 593528156
aaaa,
not 572891888887.
^^^^^^^^66$$$$$$$^^^$$
lizhenyalizhenyalizhenya
基础正则小结
基础正则
含义
搭配
^
以…开头
$
以…结尾
^$
空行
固定搭配^$
.
任意字符
*
前一个字符连续出现0次或者0次以上
.*
所有内容
固定搭配 .*
\
转义字符 \n \t
[]
匹配[]内任意单个字符[abc](a或b或c)
[]与+搭配
[^]
取反。 ^ 符号在方括号 [] 内时表示取反。匹配任何不在方括号内指定的字符集合中的单个字符
正则贪婪性
正则表达式的特点 .* 或连续出现
3.扩展正则
符号
+
|
()
{}
?
3.1 + 前一个字符连续出现1次或者1次以上
4.三剑客sed
4.1 特点及格式
sed stream editor 流编辑器,sed把处理的内容(文件),当做是水源源不断地进行处理,直到文件末尾
sed格式
命令
选项(参数)
(s)替换 sed命令功能(g)修饰符
文件
sed
-r
‘s#oldboy#oldgirl#g’
oldboy.txt
sed命令的核心功能
功能
s
替换substitute sub
p
显示 print
d
删除DELETE
cai
增加c/a/i
4.2 sed命令执行过程
找谁,干啥
找谁:哪一行
干啥:增删改查
4.3 sed核心应用
sed-查找 p
查找格式
‘2p’
指定行查找
‘1,5p’
指定行号范围进行查找
‘/lidao/p’
类似于grep过滤,//里面可以写正则
‘//,//p’
表示范围的过滤。找日志用
指定行号
#指定行号查找 [root@oldboyedu ~]# sed -n '3p' oldboy.txt 103,李导996,COO#sed -n 取消默认输出[root@oldboyedu ~]# sed -n '3p' oldboy.txt 103,李导996,COO
[root@oldboyedu ~]# sed '3p' oldboy.txt 101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#sed 指定行号范围[root@oldboyedu ~]# sed -n '1,3p' oldboy.txt 101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO[root@oldboyedu ~]# sed -n '3,6p' oldboy.txt 103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#sed 从第4行到最后一行[root@oldboyedu ~]# sed -n '4,$p' oldboy.txt 104,yy,CFO
105,feixue,CIO
110,lidao,COCO
过滤
#过滤包含oldboy[root@oldboyedu ~]# sed -n '/oldboy/p' oldboy.txt 101,oldboy,CEO#过滤包含10[root@oldboyedu ~]# sed -n '/10/p' oldboy.txt 101,oldboy,CEO
102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
110,lidao,COCO#过滤包含4或5[root@oldboyedu ~]# sed -n '/[45]/p' oldboy.txt 104,yy,CFO
105,feixue,CIO#表示范围过滤。包含102到105的行[root@oldboyedu opt]# sed -n '/102/,/105/p' oldboy.txt 102,zhangyao,CTO
103,李导996,COO
104,yy,CFO
105,feixue,CIO
向sshd_config 里面追加
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no#方法一:cat>>config<<'EOF'
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no
EOF#方法二:sedsed'$a UseDNS no\nGSSAPIAURCARION no\nPermintRootLogin no' config
#在config文件的最后一行增加
UseDNS no
GSSAPIAURCARION no
PermintRootLogin no
#这三行内容 \n 是换行
sed - 替换 s
s–> sub substitute 代替 替换
g—> global 全局替换,sed去替换所有匹配的内容,不带g的话sed默认只替换每行第一个匹配的内容
案例:取网卡的IP地址
ip a s eth0 # ip addr show eth0[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@oldboyedu ~]# [root@oldboyedu ~]# ip a s eth0 |sed -n '3p' |sed -r s#(^.*t )(.*)(/.*$)#\1#g
-bash: syntax error near unexpected token `('
[root@oldboyedu ~]#
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p' |sed-r s#(^.*t )(.*)(/.*$)#\1#g
-bash: syntax error near unexpected token `('
[root@oldboyedu ~]#
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'inet 10.0.0.200/24 brd 10.0.0.255 scope global eth0
[root@oldboyedu ~]#
#取出第一组里的
[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\1#g'inet
#取出第二组里的[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\2#g'10.0.0.200#取出第三组里的[root@oldboyedu ~]# ip a s eth0 |sed -n '3p'|sed -r 's#(^.*t )(.*)(/.*$)#\3#g'
/24 brd 10.0.0.255 scope global eth0#精简命令取出IP地址:[root@oldboyedu ~]# ip a s eth0 |sed -rn '3s#^.*t (.*)/.*$#\1#gp'10.0.0.200
awk-F , 'BEGIN{print "name"}{print $2}{print "end of file"}' oldboy.txt
[root@sanjk tmp]# awk -F , 'BEGIN{print "name"}{print $2}{print "end of file"}' oldboy.txt
name
oldboy
end of file
zhangyao
end of file
李导996
end of file
yy
end of file
feixue
end of file
lidao
end of file
[root@sanjk tmp]# ip a s eth0|awk 'NR==3'inet 10.0.0.129/24 brd 10.0.0.255 scope global eth0
[root@sanjk tmp]# ip a s eth0|awk 'NR==3'|awk -F"[ /]+" '{print $3}'10.0.0.129
[root@sanjk tmp]# ip a s eth0|awk -F"[ /]+" 'NR==3{print $3}'10.0.0.129
awk的内置变量
内置变量
NR
Number of Record 记录号,行号
NF
Number of Field 每行有多个字段(列)$NF表示最后一列的内容
FS
-F: === -v FS=: Field Separator 字段分隔符,每个字段结束标记
OFS
Output Field Separator 输出字段分隔符(awk显示每一列的时候每一列之间通过什么分隔,默认是空格)
#显示一定时间内的日志[root@sanjk tmp]# awk '/21:44:03/,/21:44:12/' /var/log/secure |wc -l4[root@sanjk tmp]# awk '/21:44:03/,/21:44:12/{print $1}' /var/log/secure
Jun
Jun
Jun
Jun