一、什么是正则表达式
1、简单的说正则表达式就是处理字符串的方法,它以行为单位来进行字符串的处理操作,正则表达式通过一些特殊符号的辅助,可以让用户轻易地完成【查找、删除、替换】某特定字符的处理过程。
1、正则表达式基本上是一种【表示法】,只要程序支持这种表示法,那么该程序就可以作为正则表达式的字符串处理之用。
二、正则表达式的用途
1、通过正则表达式对信息进行处理,仅取出有用的进行分析【帮助我们快速过滤】当然它的优点不止于此······【系统管理员用途】
2、正则表达式可以用于服务器软件【比如用于邮件服务器,可以用来拦截广告等】·········【广泛用途】
三、正则表达式分类
POSIX规范将正则表达式分为两种
1、基本正则表达式【BRE】
2、扩展正则表达式【ERB】------高级功能
区别
BRE和ERB的区别仅仅是元字符的不同,基本表达式【BRE】只承认元字符有【 ^ $.[ ]*】其他字符识别为普通字符。
扩展正则表达式【ERB】则添加了【{ } ? + | 】 等。
0.1含义
基础正则符号:
^ : 以什么开头的信息进行匹配
$ : 以什么结尾的信息进行匹配
^$ : 表示空行信息
. : 匹配任意一个 且 只有一个字符
* : 匹配星号前面字符, 连续出现0次或者多次的
. : 匹配所有字符信息
\ : 有意义-> 没意义 没意义 -> 有意义 12字
[] : 匹配多个字符信息
[^]: 匹配多个字符进行取反匹配
扩展正则符号:
? : 匹配问号前面字符, 连续出现0次或者1次的
+ : 匹配加号前面字符, 连续出现1次或者多次的
{} : 匹配花括号前面字符, 连续出现指定次数信息
{n,m} {n} {,m} {n,}
| : 匹配多个字符串信息
() : 将字符信息汇总为一个整体/后向引用前项****
02. 操作系统基础符号详细介绍
1) 基础符号系列:
#:
作用:
01. 注释说明
02. 命令提示符中, 表示用户身份-- root管理
$:
作用:
01. 调取变量
02. 命令提示符中, 表示用户身份-- 普通用户
03. 读取文件中指定列信息
| : 管道符号
作用:
01. 将管道符号前面命令输出的结果交给管道后面的命令进行处理
练习:
环境准备:
mkdir oldboy01 oldboy02 oldboy03
touch oldboy01.txt oldboy02.txt oldboy03.txt
01. 将普通文件名称是old开头, 文件大小小于100k找出来, 并移动到/tmp目录
cat /etc/services >>oldboy01.txt
find /oldboy -type f -name "old*" -size -100k | xargs mv -t /tmp
02. 将普通文件名称是.txt结尾, 文件权限为600权限找出来, 并复制到/tmp目录中
chmod 600 oldboy02.txt
find /oldboy -type f -name "*.txt" -perm 600 | xargs cp -t /tmp
03. 将普通文件名称是02.txt找出来, 但不包含oldboy02目录中的, 进行批量删除(至少三种方法)
touch oldboy{01..03}/{01..03}.txt
find /oldboy -type f -name "02.txt" ! -path "/oldboy/oldboy02/*" -delete
find /oldboy -type f -name "02.txt" ! -path "/oldboy/oldboy02/*" -exec rm -f {} \;
find /oldboy -type f -name "02.txt" ! -path "/oldboy/oldboy02/*" | xargs rm
! :
作用:
01. 取反操作
02. 快速调取历史命令 !命令信息
history -- 历史
history -c 清除历史命令记录
history -w 将内存中保存历史记录永久保存到~/.bash_history文件中
练习:
01. 在/oldboy目录找寻数据信息.
从oldboy/oldboy01目录中, 将 02.txt 03.txt文件找出来
从oldboy/oldboy02目录中, 将 01.txt 03.txt文件找出来
从oldboy/oldboy03目录中, 将 01.txt 02.txt文件找出来
一条命令搞定
|-- oldboy01
|
| |-- 02.txt
| `-- 03.txt
|-- oldboy02
| |-- 01.txt
|
| `-- 03.txt
|-- oldboy03
| |-- 01.txt
| |-- 02.txt
|
思路一:
从oldboy/oldboy01目录中, 将 01.txt文件找出来
find /oldboy -path "/oldboy/oldboy01/*" -name "01.txt"
从oldboy/oldboy02目录中, 将 02.txt文件找出来
find /oldboy -path "/oldboy/oldboy02/*" -name "02.txt"
从oldboy/oldboy03目录中, 将 03.txt文件找出来
find /oldboy -path "/oldboy/oldboy03/*" -name "03.txt"
取反操作
find /oldboy -path "/oldboy/oldboy01/*" ! -name "01.txt"
find /oldboy -path "/oldboy/oldboy02/*" ! -name "02.txt"
find /oldboy -path "/oldboy/oldboy03/*" ! -name "03.txt"
思路二: 将多个find命令整合
-a 并且关系
-o 或者关系
find /oldboy -path "/oldboy/oldboy01/*" ! -name "01.txt" -o -path "/oldboy/oldboy02/*" ! -name "02.txt" -o -path "/oldboy/oldboy03/*" ! -name "03.txt"
2) 引号符号系别:
"" : 将指定信息进行输出显示 可以将特殊字符信息进行解析输出
echo "$PATH `which cat` oldboy67"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin /usr/bin/cat oldboy67
'' : 将指定信息进行输出显示 所见即所得
echo '$PATH `which cat` oldboy67'
$PATH `which cat` oldboy67
没有引号 : 和双引号功能是类似, 但是没有引号情况可以输出序列信息
echo {01..10} 数字序列
echo {a..z} 字母序列
echo {01..10..2} 奇数序列
mkdir oldboy{01..10}
seq -w 10 --- ? 如何生成奇数序列/生成偶数序列
`` : 将引号中命令信息先执行, 将执行后结果交给引号外面的命令进行处理
cp /etc/hosts /etc/hosts_`date +%F`
练习:
环境准备:
vim test.txt
oldboy $oldboy oldgirl
01. 利用sed如何将$oldboy信息修改替换为olddog
sed 's#$oldboy#olddog#g' 文件信息
3) 路径符号系列:
~ : 当前系统用户家目录
. : 表示当前目录
表示隐藏文件 .oldboy.txt.swp
中断编辑 -- 恢复文件信息 --- 删除隐藏文件
同时编辑 -- 其他用户编辑完, 在进行编辑
.. : 表示上级目录
- : 上一次所在目录
4) 定向符号系列:
> : 标准输出重定向符号
>> : 标准输出追加重定向符号 定时任务
2> : 错误输出重定向符号
2>> : 错误输出追加重定向符号
< : 标准输入重定向符号
tr 'A-Z' 'a-z' < 文件信息
xargs -n1 < 文件信息
<< : 标准输入追加重定向符号
cat >> /oldboy.txt <<EOF
XXX
XXX
EOF
5) 逻辑符号系列: shell脚本
第一件事: 创建目录 /oldboy
第二件事: 检查是否存在/oldboy
第三件事: 在/oldboy目录中创建oldboy.txt
&& : 前一个事情成功完成了, 再做下一件事情
mkdir /oldboy && touch /oldboy/oldboy.txt
[root@linux67 /]# mkdi /oldboy && touch /oldboy/oldboy.txt
-bash: mkdi: command not found
[root@linux67 /]# mkdi /oldboy ; touch /oldboy/oldboy.txt
-bash: mkdi: command not found
touch: cannot touch ‘/oldboy/oldboy.txt’: No such file or directory
|| : 前一个事情出现失败了, 再做一件事情
[root@linux67 /]# mkdi /oldboy || mkdir /oldboy
-bash: mkdi: command not found
[root@linux67 /]# ll -d /oldboy
drwxr-xr-x 2 root root 6 Nov 1 18:44 /oldboy
[root@linux67 /]# mkdir /oldboy && touch /oldboy/oldboy.txt || mkdir /oldboy
[root@linux67 /]# ll -d /oldboy
drwxr-xr-x 2 root root 24 Nov 1 18:45 /oldboy
[root@linux67 /]# ll /oldboy
total 0
-rw-r--r-- 1 root root 0 Nov 1 18:45 oldboy.txt
[root@linux67 /]# rm /oldboy -rf
[root@linux67 /]# mkdi /oldboy && touch /oldboy/oldboy.txt || mkdir /oldboy
-bash: mkdi: command not found
[root@linux67 /]# ll -d /oldboy
drwxr-xr-x 2 root root 6 Nov 1 18:46 /oldboy
[root@linux67 /]# ll /oldboy
total 0
-
操作系统通配符号介绍:
- 匹配任意字符信息
find /oldboy -name “old*”/".txt"/"old.txt"
rm /oldboy/.txt /oldboy/oldboy
rm -rf ./* — 清空目录中文件数据(清空可见文件)
rm -rf ./.o* — 删除以O打头的信息
rm -rf ./.* — 删除根目录下面所有数据信息
{} 匹配序列信息
-
生成数字或者字母序列信息
-
生成组合序列信息
[root@linux67 oldboy]# echo A{1…3}
A1 A2 A3
[root@linux67 oldboy]# echo {1…3}B
1B 2B 3Becho A{,3}
A A3
echo /oldboy/oldboy.txt{,.bak}
快速备份:
cp /oldboy/oldboy.txt /oldboy/oldboy.txt.bak --简化-- cp /oldboy/oldboy.txt{,.bak}
快速恢复:
cp /oldboy/oldboy.txt.bak /oldboy/oldboy.txt --简化-- cp /oldboy/oldboy.txt{.bak,}cp /oldboy/oldboy.txt.bak /oldboy/oldboy.txt
- 匹配任意字符信息
-
操作系统正则符号:
准备操作环境:
cat >> test.txt <<EOF
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
EOF
基础正则符号: BRE basic regular expression
^ --- 匹配以什么开头信息 ^xxx
grep "^I" test.txt
练习: 找出文件中以大写字母I开头的信息
$ --- 匹配以什么结尾信息
grep "m$" test.txt
练习: 找出空行信息
grep "^$" 文件
练习: 排除空行不显示
[root@linux67 oldboy]# grep -v "^$" test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
练习: 找出以m开头 和 以m结尾行
[root@linux67 oldboy]# grep "^m.*m$" test.txt
mm
my blog is http://oldboy.blog.51cto.com
^$ 表示空行信息
. 匹配任意一个且只有一个字符
grep sed awk 处理文件时, 会按照每一行进行处理文件
[root@linux67 oldboy]# grep "." test.txt -o
I
a
m
o
l
d
[root@linux67 oldboy]# grep ".$" test.txt
I am oldboy teacher!
I teach linux.
mm
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY
* 匹配星号前面一个字符连续出现0次或者多次情况
[root@linux67 oldboy]# grep "o*" test01.txt
gd
god
good
goood
gooood
[root@linux67 oldboy]# grep "0*" test.txt
I am oldboy teacher!
I teach linux.
mm
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
.* 匹配所有内容
[] 匹配多个字符信息
grep "[0-9]" test.txt
等价于:
grep "0" test.txt
grep "1"
[root@linux67 oldboy]# grep "[0-9a-zA-Z]" test.txt
I am oldboy teacher!
I teach linux.
mm
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
[^xx] 将匹配多个字符进行取反
[root@linux67 oldboy]# grep “[^0-9a-zA-Z]” test.txt
I am oldboy teacher!
I teach linux.
I like badminton ball ,billiard ball and chinese chess!
my blog is http://oldboy.blog.51cto.com
our site is http://www.etiantian.org
my qq num is 49000448.
not 4900000448.
my god ,i am not oldbey,but OLDBOY!
\ 转义符号
1) 将有意义信息变得没有意义
[root@linux67 oldboy]# grep "\.$" test.txt
I teach linux.
my qq num is 49000448.
not 4900000448.
2) 将没有意义字符变得有意义
\n \r --- 换行符
\t
3) 让扩展正则可以变为基础正则???
PS:
1) 正则符号使用时, 可以结合使用
2) 正则符号做匹配时,有贪婪匹配特性
解决贪婪:
[root@linux67 oldboy]# grep "^I.*e ba" test.txt
I like badminton ball ,billiard ball and chinese chess!
扩展正则符号: ERE extended regular expression
通配符号 和 正则符号 区别:
通配符号: 匹配文件名称信息 * 基础命令可以识别通配符号 find rm cp ll
正则符号: 匹配文件内容信息 高级命令可以识别正则符号 grep sed awk
系统扩展正则符号
说明: 扩展正则符号属于高级符号, 只能三剑客命令中 awk grep—>egrep grep -E sed —> sed -r
+ : 匹配加号前面一个字符 连续出现1次或者多次的
[root@linux67 oldboy]# cat test01.txt
gd
god
good
goood
[root@linux67 oldboy]# egrep "go+d" test01.txt
god
good
goood
练习题: 验证以下信息, 身份证合法性
张三: 110109199905060876
李四: oldboy
王五: 210109198807086789
[root@linux67 oldboy]# grep -E [0-9]+ test02.txt -o
110109199905060876
210109198807086789
[数字]+ : 将连续数字字符串信息进行匹配
[字母]+ : 将连续字母字符串信息进行匹配
? : 匹配问号前面一个字符 连续出现0次或者1次的
[root@linux67 oldboy]# grep -E "o+" test01.txt
god
good
goood
[root@linux67 oldboy]# grep -E "o?" test01.txt
gd
god
good
goood
[root@linux67 oldboy]# grep -E "o?" test01.txt -o
o
o
o
o
o
o
[root@linux67 oldboy]# grep -E "o+" test01.txt -o
o
oo
ooo
PS: 用于匹配问号前一个字符可能出现, 可能没有出现
{} : 匹配花括号前面一个字符 连续出现指定次数
{n,m} : 匹配最少出现n次, 最多出现m次的
[root@linux67 oldboy]# cat test01.txt
gd
god
good
goood
gooood
goooood
gooooood
[root@linux67 oldboy]# grep -E "o{3,5}" test01.txt -o
ooo
oooo
ooooo
ooooo
[root@linux67 oldboy]#
[root@linux67 oldboy]# grep -E "o{2,6}" test01.txt -o
oo
ooo
oooo
ooooo
oooooo
{n} : 匹配正好出现n次连续字符串信息
[root@linux67 oldboy]# grep -E "o{2}" test01.txt
good
goood
gooood
goooood
gooooood
[root@linux67 oldboy]# grep -E "o{2}" test01.txt -o
oo
oo
oo
oo
oo
oo
oo
oo
oo
{n,} : 匹配最少出现n次, 最多出现次数没有限制
[root@linux67 oldboy]# cat test01.txt
gd
god
good
goood
gooood
goooood
gooooood
[root@linux67 oldboy]# grep -E "o{2,}" test01.txt -o
oo
ooo
oooo
ooooo
oooooo
[root@linux67 oldboy]# grep -E "o{2,}" test01.txt
good
goood
gooood
goooood
gooooood
{,m} : 匹配最少出现0次, 最多出现m次数
[root@linux67 oldboy]# grep -E "o{,5}" test01.txt
gd
god
good
goood
gooood
goooood
gooooood
[root@linux67 oldboy]# grep -E "o{,5}" test01.txt -o
o
oo
ooo
oooo
ooooo
ooooo
o
() :
作用:
01. 将多个字符信息汇总成一个整体字符串 vs []
02. 利用sed命令进行替换时, 实现后项引用前项
echo 123 ---> <123> echo 123|sed 's#123#<123>#g'
[root@linux67 oldboy]# echo 01oldboy|sed -r 's#([A-Za-z0-9]+)#<\1>#g'
<01oldboy>
[root@linux67 oldboy]# echo 01oldboy|sed -r 's#(.*)#<\1>#g'
<01oldboy>
echo 123456 ---><12><34><56> --> <34><12><56>
# echo 123456|sed -r 's#(..)(..)(..)#<\2><\1><\3>#g'
<34><12><56>
PS: \n : 可以引用 1 - 9 括号中的内容
# echo 123456|sed -r 's#([0-9]{2})([0-9]{2})([0-9]{2})#<\2><\1><\3>#g'
<34><12><56>
echo 123456 ---><123><456>
echo 123456 ---><1><2><3><4><5><6>
解锁:
01. 如何取出IP地址信息 grep centos7 centos6
思路1): 如何显示出IP地址
ip a s eth0
思路2): 显示出有IP地址行信息
ip a s eth0|grep "inet "
思路3): 什么信息是IP地址
四组数字以点分割就是IP地址, 每组数字 可以是一位数/可以是两位数/可以是三位数
# ip a s eth0|grep "inet "|grep -E "[0-9]{1,3}\.[0-9]{1,3}"
1-3数字 . 1-3数字
inet 10.0.0.200/24 brd 10.0.0.255 scope global noprefixroute eth0
# ip a s eth0|grep "inet "|grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" -o|head -1
10.0.0.200
ip a s eth0|grep "inet "|grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" -o|head -1
10.0.0.200
ip a s eth0|grep "inet "|grep -E "([0-9]{1,3}\.?){4}" -o|head -1
10.0.0.200
练习: 取出网络MAC地址 由两位组成(0-9 a-f)
# ip a s eth0|grep "link/"|grep -E "([0-9a-f]{2}:?){6}" -o|head -1
00:0c:29:6e:a9:8a
作用说明: 分析日志 access.log 有哪些主机访问你的服务器
hostname -I
02. 如何取出文件权限信息
stat access.log |grep Uid|grep -E "[0-7]+" -o|head -1
0644
stat -c %a /etc/hosts
03. 如何实现批量创建用户 oldboy01..oldboy10, 并设置随机密码(不能使用for循环批量创建用户)
()
思路1) 掌握如何创建用户 给用户设置密码 单个用户设置密码
useradd xx ;echo 密码 |passwd --stdin 用户信息
思路2) 批量创建用户并设置密码, 按照序列方式
seq -w 10|sed -r 's#(.*)#useradd oldboy\1;echo 123456|passwd --sdtin oldboy\1#g'
echo {oldboy,oldgirl,olddog}|xargs -n1|sed -r 's#(.*)#useradd \1;echo 123456|passwd --stdin \1#g'
思路3) 创建用户密码信息是随机密码
date "+%N"|md5sum |head -c 6
useradd oldboy10; Password=`date "+%N"|md5sum |head -c 6`; echo $Password|passwd --stdin oldboy10; echo oldboy10 $Password >>/tmp/passwd.txt
# seq -w 10|sed -r 's#(.*)#useradd oldboy\1; Password=`date "+%N"|md5sum |head -c 6`; echo $Password|passwd --stdin oldboy\1; echo oldboy\1 $Password >>/tmp/passwd.txt#g'|bash
04. 如何批量修改文件扩展名
思路1) 单个文件修改名称
mv /oldboy/oldboy.txt /oldboy/oldboy.jpg
sed "s#(oldboy01.)txt#mv /oldboy/\1txt /oldboy/\1jpg#g"
思路2) 多个文件批量修改扩展名
ls ./*|xargs -n1|sed -r 's#(.*)txt#mv \1txt \1jpg#g'|bash
#rename "替换的信息" "替换成什么信息" 哪些文件要做名称修改
rename ".jpg" ".txt" oldboy*
| 匹配多个字符串信息
[root@linux67 oldboy]# grep -E "oldboy|oldgirl" test.txt
oldboy linux python
oldgirl linux python go
# grep -Ev "^#|^$" test.txt
oldgirl linux python go
- 课程知识总结说明
- ???
? ???
{} ???
() ???
| ???
PS: 扩展正则符号 只能被 grep -E(egrep) sed -r awk
\ 将扩展正则转换为普通
[root@linux67 oldboy]# grep “oldboy|oldgirl” test.txt
- ???

被折叠的 条评论
为什么被折叠?



