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正则表达式的主要内容,如果未能解决你的问题,请参考以下文章