SHELL训练营--day4--正则1

正则及正则的意义

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

转载于:https://blog.51cto.com/sincethen/2333638

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值