linux正则表达式

Posted LEO00

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux正则表达式相关的知识,希望对你有一定的参考价值。

linux正则表达式

1、什么是正则表达式?

简单的说,正则表达式就是为处理大量的字符串而定义的一套规则和方法。
例如:假设“@”代表syz1,“!”代表syz2,echo"@!"===“syz1syz2”
通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串。
linux正则表达式一般以“行”为单位处理的。

2、为什么要学会正则表达式?

在企业工作中,我们每天做的linux运维工作中,时刻都会面对大量带有字符串的文本配置、程序、命令输出及日志文件等,而我们经常会有迫切的需要,从大量的字符串内容中查找符合工作需要的特定的字符串,这就是正则表达式,因此可以说正则表达式就是为了过滤这样的字符串的需求而生的。

3、容易混淆的两个注意事项:

a、正则表达式应用非常广泛,存在于各种语言中,例如:php,Python、Java等,但是,我们讲的是linux系统运维工作中的正则表达式,即linux正则表达式,最常应用正则表达式的命令就是grep(egrep),sed,awk,换句话说linux三剑客要想能工作的更高效,那一定离不开正则表达式配合的。

b、正则表达式和我们常用的通配符特殊字符是有本质区别的,这一点伙伴们要注意。通配符例子:ls *.log 这里的*就是通配符(表示所有),不是正则表达式。

一:基础正则

表达式 含义
^ ^word表示匹配以word开头的内容(打印的是一行内容),vi/vim 编辑器里^代表一行的开头
$ word$表示匹配word结尾的内容(打印的是一行内容),vi/vim编辑器里$代表一行的结尾
^$ 表示空行
. 代表且只能代表任意一个字符
.就只代表点本身,转义符号,让有着特殊身份意义的字符,脱掉马甲,还原原形
* 重复0个或多个前面一个字符,例如:0*,有1个0或多个000000
.* 匹配所有字符,延伸^.*以任意多个字符开头,.*$以任意多个字符结尾
[abc] 匹配字符集合内的任意一个字符[a-zA-Z],[0-9](单个字符而不是包含的单词)
[^abc] 匹配不包含^后的任意一个字符的内容(单个字符而不是包含的单词);其中括号里^为取反,注意和中括号内以^开头区别
a{n,m}

重复n到m次,前一个重复的字符,如果用egrep/sed -r可以去掉斜线;

例子:gerp "0{3,4}" syz.log  意思为,0匹配,3-4次

         my qq name is 49000448

         not 490000048

a{n,} 重复至少n次,前一个重复的字符,如果用egrep/sed -r 可以去到斜线
a{n}

重复n次,前一个重复的字符,如果用egrep/sed -r 可以去掉斜线

例子:gerp "0{3}" syz.log  意思为,0匹配,3次

         my qq name is 49000448

a{,m}

????Centos5不能用,Centos6、7可以用

例子:gerp "0{3}" syz.log  意思为,0匹配,3次

         my qq name is 49000448

注意:

egrep(grep -E)或sed -r 过滤一般特殊字符可以不转义(即不用)。

例如egrep(grep -E) "0{3}" syz.log

点(.)的含义小结:

1、当前目录
2、使得文件生效相当于source
3、隐藏文件
4、任意一个字符(grep正则)

扩展的正则表达式:

1、+ 表示重复“一个或一个以上”前面的字符(*是0或多个)
例子:[[email protected] ~]# cat syz.txt
my god ,i am syz
gd
good
[[email protected] ~]# egrep "g+d" syz.txt
gd
[[email protected] ~]# egrep "go+d" syz.txt
my god ,i am oldboy
good
[[email protected] ~]# egrep "go*d" syz.txt
my god ,i am syz
gd
good

2、? 表示重复“0个或一个”前面的字符(.是有且只有一个)
例子:
[[email protected] ~]# cat syz.txt
my god ,i am syz
gd
good
goood
[[email protected] ~]# egrep "go?d" syz.txt
my god ,i am syz
gd
[[email protected] ~]# egrep "go.d" syz.txt
good
3、| 表示同时过滤多个字符串
例子:
[[email protected] ~]# egrep "god|good" syz.txt
my god ,i am syz
good
4、() 分组过滤(少用),后向引用(主用)
例子:
[[email protected] ~]# egrep "g(la|oo)d" syz.txt
good
glad

元字符:
 单词边界
例子:
[[email protected] ~]# grep "syz" syz.txt
my god ,i am syz
syz1
[[email protected] ~]# grep "syz" syz.txt
my god ,i am syz

通配符

通配符一般用户命令行bash环境,而linux正则表达式用于grep/sed/awk场景;

linux通配符和三剑客(grep/awk/sed)正则表达式是不一样的,因此,代表的意义也是有较大区别的。

通配符 含义
* 通配符,代表所有(0到多个)字符

通配符,代表任意1个字符

例子:ls ????.txt  会匹配4个字符如test.txt

         ls ?.txt     会匹配1个字符如t.txt

连续不同命令的分隔符(两个命令的分隔符)
# 配置文件注释(就是让其命令失效,但可以给管理员看到)
| 管道
~ 当前用户的家目录
- 上一次所在的目录(路径)
$

变量前需要加的符号

例子:[[email protected] test]# echo $LANG

         en_US.UTF-8

/ 路径分隔符号,也是根的意思
>或1> 重定向,覆盖原有数据
>> 追加重定向,追加内容文件尾部
< 输入重定向(xargs,tr)
<< 追加输入重定向

单引号,不具有变量置换功能,输出时所见即所得

例子:[[email protected] test]# echo ‘date‘

date

"

双引号,具有变量置换功能,解析变量后输出,不加引号相当于双引号,常用双引号

例子:[[email protected] test]# echo "`date`"

         Fri Jul 20 20:11:49 CST 2018

         [[email protected] test]# echo "$(date)"

         Fri Jul 20 20:12:44 CST 2018

 `  tab键上面的键,反引号,两个``中间为命令,会先执行,等价于$()
 {}

 中间为命令区块组合或内容序列

例子:[[email protected] test]# echo syz{1,2,3}

         syz1 syz2 syz3

 !  逻辑运算中的“非”(not)
 &&  (and)并且,两边条件同时满足,当前一个指令执行成功时,执行后一个指令
 ||  (or)或者,当前一个指令执行失败时,执行后一个指令
 ..  两个点代表上一级目录
 .  点代表当前目录

















































以上是关于linux正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Linux正则表达式教程:Grep Regex示例

Linux正则表达式及grep命令

linux-正则表达式

linux正则表达式

linux 中 ^[^abc] 正则表达式啥意思

Linux 基础正则表达式