正则及正则的意义

有这样一个文本文件,我们需要从里面查找 信息时,需要怎么处理呢? 一行行看么,有计算机,可以让计算机帮助我们查找。 计算机如何查找?如何匹配?这里就涉及到匹配规则,这种规则 ,我们可以称之为正规。 正则表达式(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

* 字符匹配
	```shell
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
	```shell
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 :直接修改文件内容 注意,默认sed会首会打印出需要处理的行,再执行命令中的动作。如果只需要显示 匹配到的行,使用 "-n"参数。它常和“p”动作一起使用。 注意的是,sed使用参数 -e 支持对单个文件 进行不同的操作。 如对 m.conf 去除以空行和以“#”开头的行。 写法:sed -e ‘/^$/d’ -e '/^#/d' m.conf

  • sed command 参数 包含以下动作: 查找,处理方法。

    • 查找动作,指定操作范围。

      查找动作: 以查询方法可分为两类: 1.以行为标识。如 第5行。 5 2.查询包含模式的行。 如 包含字符 test的:/test/ 以上是单行查询,也可指定查找范围。

      1. 以指定行为查找范围。如5到8行:'5,8'
      2. 以查询包含模式指定行。如以包含test1的行 为首行 到 第一个包含end的行 为结尾的行:/test1/,/end/
      3. 两个查找方法混合。如:'4,/test/' ,'/test/,4 '
    • 处理动作:指定处理动作。

      处理动作比较多。下面列举常用: “p” 打印。如:sed -n '1,4p' 1.txt “d” 删除动作。如:sed '2d' 1.txt "s/匹配字符串/替换字符串/替换标记" 替换字符串。如:“s/oo/ii/” 匹配字符串和替换字符串,如果需要使用正规表达式,那么option需加 "-r" 参数。 常用替换标记: 1. g 表示指定的所有行都进行全面替换。否则只替换第一个匹配到的。 2. p 表示打印行。 3. w 表示操作行替换后写入后面的文件 。如 sed '1,$s/oo/ii/w 2.txt' 1.txt "!" 表示后面的命令对所有没有被选定的行发生作用。 如: sed '/oo/!p' 1.txt 注意:“!”可以作用于范围。如:sed '/^#/!{/^$/!p}' 1.txt   "a\ 一行内容" 在匹配行后面加入一行文本。 “i\ 一行内容" 在匹配行上面插入文本。 ”c\ 一行内容" 用新的文本改变匹配行的文本。 例子:sed '/^hello/a\\--->this is a example' 1.txt 在匹配到以 hello开头的行后,在前面加一行’--->this is a example'。 注意 参数a后面需要跟一"" 这里需要转义,所以用 “\” 来脱义。   "=" 打印行号。 这里引入"{}"概念,连接的动作,可利用它来标明。并将动作用“;”分隔。 如:sed -n '/good/{=;p}' 1.txt