linux正则表达式

一、什么是正则表达式
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
  1. 操作系统通配符号介绍:

    • 匹配任意字符信息
      find /oldboy -name “old*”/".txt"/"old.txt"
      rm /oldboy/.txt /oldboy/oldboy
      rm -rf ./* — 清空目录中文件数据(清空可见文件)
      rm -rf ./.o* — 删除以O打头的信息
      rm -rf ./.* — 删除根目录下面所有数据信息

    {} 匹配序列信息

    1. 生成数字或者字母序列信息

    2. 生成组合序列信息
      [root@linux67 oldboy]# echo A{1…3}
      A1 A2 A3
      [root@linux67 oldboy]# echo {1…3}B
      1B 2B 3B

      echo 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

  2. 操作系统正则符号:
    准备操作环境:
    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
  1. 课程知识总结说明
    • ???
      ? ???
      {} ???
      () ???
      | ???
      PS: 扩展正则符号 只能被 grep -E(egrep) sed -r awk
      \ 将扩展正则转换为普通
      [root@linux67 oldboy]# grep “oldboy|oldgirl” test.txt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值