正则及正则的意义
有这样一个文本文件,我们需要从里面查找 信息时,需要怎么处理呢?
一行行看么,有计算机,可以让计算机帮助我们查找。
计算机如何查找?如何匹配?这里就涉及到匹配规则,这种规则 ,我们可以称之为正规。
正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。
在linux中,我们可以用 grep/awk/sed 调用正则表达式,来查找相关信息。
一般情况下,是对行进行查找匹配并进行处理的。
为什么 这样?如果直接对文件进行处理,我们考虑这样的情况 ,文件小时,可以直接加载到内存。那么当文件 有几百M,几个G等,很大时,能直接放入么?如果对文件 进行修改,怎么增删改?所以将文件分为更小的部分,以行为单位。便于处理输出。
grep 命令
> global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来.
> grep 主要是用来搜索文件信息。
> 语法大致是这样: 【grep 参数 ‘匹配字符’ 匹配文件】。grep 'root' /etc/passwd
> 参数说明:
> “-c”: count 统计匹配的行数。
> "-i" : 匹配条件忽略字符的大小写。
> "-n”: 打印匹配信息时,输出所在行号。
> “-v”: 取反的意思,打印出不合规则的行。
> “-A","-B","-C":打印匹配信息相邻的行。A=after,B=before,C=centre.
> "-q": 逻辑判断的意思,常和if 一起使用。如:`if grep -q hello a.txt ; then echo yes;else echo no; fi `
> "-r": 递归查询,查询 **目录** 下文件是否有匹配到信息。如:`grep -r "root" /etc/`
- linux下文本行的相关信息
存储的是以”\n“为行结尾。在做匹配信息时,以"^"表示行的开始,以”$“表示行结束。
如 匹配以 # 开头时,可以这样写匹配信息:"^#"。
匹配以"good."结束时,这样写:”good.$“
表示空行时,”^$“。
这里涉及到行中有”^“或是”$“时,写法。[root@cpdl ~]# cat 1.txt good. nice. good hello good.$helo [root@cpdl ~]# grep -n "good.$" 1.txt 1:good. [root@cpdl ~]# grep -n "good.\\$" 1.txt 4:good.$helo
- 字符串匹配
grep -n "root" /etc/passwd grep -vn "nologin" /etc/passwd grep -n '^\(root|bin\)' /etc/passwd
- 字符匹配
grep [0-9] /etc/passwd grep [^0-9] /etc/passwd grep "^root[a-z]*$' /etc/passwd grep "^[rb]" /etc/passwd grep "[^r]oo" /etc/passwd grep '^$' /etc/passwd grep '[^a-zA-Z]' /etc/passwd
- 模糊字符串匹配
grep 'r..t' /etc/passwd grep 'oo*' /etc/passwd #“*”表示零个或多个前面的字符,oo*表示o, oo, ooo..... grep '.*' /etc/passwd |wc -l # ‘.*’表示零个或多个任意字符,空行也包含在内 grep 'o\{2\}' /etc/passwd
- grep扩展命令,egrep
egrep 'o+' 1.txt # 表示1个或1个以上前面字符 egrep 'o?' 1.txt # 表示0个或者1个前面字符 egrep 'roo|body' 1.txt # 匹配roo或者匹配body egrep 'r(oo)|(at)o' 1.txt # 用括号表示一个整体 egrep '(oo)+' 1.txt # 表示1个或者多个 'oo'
. * + ? 总结
. 表示任意一个字符(包括特殊字符)- 表示零个或多个*前面的字符
.* 表示任意个任意字符(包含空行)
+ 表示1个或多个+前面的字符
? 表示0个或1个?前面的字符
其中,+ ? grep不支持,egrep才支持。
- 表示零个或多个*前面的字符
sed
sed: stream editor for filtering and transforming text 用户过滤和转换文本的流编辑器
sed 主要是用来实现查找 替换功能。
命令格式:“sed [option] 'sed command' filename”
- option 参数说明
-n :只打印模式匹配的行
-e :直接在命令行模式上进行sed动作编辑,此为默认选项
-r :支持扩展表达式
-i :直接修改文件内容