一、什么是正则表达式 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 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
操作系统正则符号: 准备操作环境: 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