Linux_通配符+正则表达式

心不动则不痛 提交于 2020-12-29 07:39:47

系统通配符号:

*  -- 匹配所有内容信息 

【应用场景一: 找寻数据信息时】
find /oldboy -name "*.txt"
find /oldboy -name "oldboy*"
find /oldboy -name "oldboy*.txt"
【应用场景二: 操作管理数据】
ll /oldboy/oldboy*  
rm -rf /oldboy/*
cp -a /oldboy/*  /tmp/
rm /oldboy/* --> cd /oldboy  rm -rf /*

{} -- 匹配序列内容信息 {01..100} {a..z} {A..Z}

  【应用场景一: 生成序列信息】
  echo {01..10}      --- 生成连续序列
  echo {01..10..2}   --- 生成等差序列  
  [root@localhost ~]# echo {a..z}
    a b c d e f g h i j k l m n o p q r s t u v w x y z
    [root@localhost ~]# echo {a..z..2}
    a c e g i k m o q s u w y
  [root@localhost ~]# echo {01,03,07,08,09}
    01 03 07 08 09

  应用场景二: 生成组合序列
  echo {01..03}{A..C}
  01A 01B 01C 02A 02B 02C 03A 03B 03C


  echo A{,B} --> A AB
  echo oldboy.txt{,.bak} --> oldboy.txt  oldboy.txt.bak
    cp /etc/selinux/config{,.bak}   --- 快速备份数据方法

  echo A{B,} --> AB A
  echo oldboy.txt{.bak,} --> oldboy.txt.bak oldboy.txt
  cp oldboy.txt{.bak,}            --- 快速还原数据方法
 

正则表达式:

1.正则表达式是一种文本模式匹配,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、将匹配的子串替换或者从某个字符串中取出某个条件的子串。

2.正则表达式就像数学公式一样,我们可以通过正则表达式提供的一些特殊字符来生成一个匹配对应字符串的公式,用此来从海量数据中匹配出自己想要的数据。

3.正则表达式是一个三方产品,被常用计算机语言广泛使用,比如:shell、PHP、python、java、js等!

4.shell也支持正则表达式,但不是所有的命令都支持正则表达式,常见的的命令中只有grep、sed、awk命令支持正则表达式。

正则符号 vs 通配符号 

通配符号: 匹配文件名称信息
正则符号: 匹配文件内容信息

基础正则符号: basic regular expression -- BRE
扩展正则符号: extended regular expression -- ERE

【基础正则 BRE】

01.定位符使用技巧:同时锚定开头和结尾,做精确匹配;单一锚定开头和结尾,做模糊匹配。 

定位符    说明
^       锚定开头 ^a 以a开头 默认锚定一个字符

$       锚定结尾 a$ 以a结尾 默认锚定一个字符
  

 

^   --- 匹配筛选以什么开头的信息

找出文件/etc/service 以s开头的信息

  

找出/oldboy目录中 文件内容是oldboy开头的文件

老三: grep

grep "^s" /etc/services

[root@localhost oldboy]# grep -r "^oldboy" /oldboy 
/oldboy/oldboy.txt:oldboy
/oldboy/oldbaby.txt:oldboy01
/oldboy/oldboy01/oldboy.txt:oldboy
/oldboy/oldboy01/oldbaby.txt:oldboy01

老二: sed  

sed -n '/^s/p' /etc/services

 

老大: awk

 

awk '/^s/' /etc/services

 

 

 

 $   --- 匹配筛选以什么结尾的信息

找出文件/etc/service 以s结尾的信息
老三: grep
grep "s$"  /etc/services

^$ --- 匹配空行信息

grep "^$" /etc/services --- 匹配出文件空行
grep -c "^$" /etc/services --- 统计文件空行数量
grep "^$" /etc/services|wc -l
grep -v "^$" /etc/services --- 排除空行不要显示

.   --- 匹配任意一个且只有一个字符信息

[root@localhost oldboy]# grep ol.boy oldboy.txt 
oldboy
[root@localhost oldboy]# grep ol..boy oldboy.txt 
ol12boy
[root@localhost oldboy]# grep "." oldboy.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!
grop -o: 显示匹配的过程
 

*  --- 匹配星号字符前面的一个字符 连续出现0次或者多次的情况



.* --- 匹配所有内容信息


 

 

正则符号匹配字符信息时,有贪婪匹配特性

\  --- 转义符

1) 将有特殊意义的符号变得没有意义



2) 将没有页数意义的字符变得有意义
 
\n    --- 换行字符
\r    --- 换行字符
\t    --- 制表符

 


3) 取消别名功能
\rm -rf /oldboy.txt

二、特殊字符

匹配符:匹配字符串,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
    它是一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串、       
      将匹配的子串替换或者从某个字符串中取出某个条件的子串

 [] - 可以匹配多个任意一个字符

[abc]: 匹配字符集合内的任意一个字符[a-z,A-Z],[0-9]等
匹配出文件中所有的字母信息(大小写问题)

 

 ~~~测试文件中以I开头行和以m开头的行都找出来】


[^abc]:匹配不包含^后面的任意一个字符的内容

  练习题: 去除文件中所有符号信息
  grep "[^0-9a-Z]" oldboy.txt

【表示匹配不包含I, ^, o的信息】

[ ^ ] 表示否定括号中出现字符类中的字符,取反。

 

扩展正则符号:

grep sed awk 直接识别基础正则符号
grep sed     不能直接识别扩展正则符号
grep -E/ egrep /sed -r 识别扩展正则信息

 

+ --- 匹配加号字符前面的一个字符 连续出现1次或者多次的情况

{} --- 匹配花括号号字符前面的一个字符 匹配指定连续出现多少次

{n,m} --- 至少连续匹配n次,最多连续匹配m次

{n}     --- 正好连续匹配n次

{n,} --- 最少连续匹配n次,最多连续匹配没有限制

{,m} --- 最少连续匹配0次, 最多连续匹配m次

?  --- 匹配问号字符前面的一个字符 连续出现0次或者1次的情况

 证件身份证号的匹配!

 

 | --- 匹配多个字符串信息, 多个字符串之间是或者关系  

[root@localhost oldboy]# grep -E "oldboy|oldbey" oldboy.txt 
I am oldboy teacher!
my ^blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!
[root@localhost oldboy]# grep "oldb[oe]y" oldboy.txt 
I am oldboy teacher!
my ^blog is http://oldboy.blog.51cto.com
my god ,i am not oldbey,but OLDBOY!

 ()字符串分组

1.将多个字符信息汇总为整体进行匹配
2.将指定信息做替换时。后向引用前项

【取出/etc/service文件中有#开头的行 和 空行】

【 排除有#号开头和空行内容】

echo 123456  --> <123><456>

echo 123456  --> <1><2><3><4><5><6>
 
文件的批量重命名:
 
oldboy01..10.txt --> oldboy01..10.jpg
sed的后向引用:
sed -n 's#()()#\1\1#gp' file
当在前面匹配部分用小括号的时候,第一个括号内容,可以在后面部分用\1输出

1.获取系统ip:



#字符串的对调

 获取文件的权限

获取目录的权限

总结:

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!