正则介绍 grep 上中下

正则介绍 grep

  • egrep 是 grep 的扩展
  • 如图, grep 'nologin' passwd 能够搜索passwd中含有nologin的数据行
  • 而后用颜色显示 nologin
  • which grep 能够看到 grep 是一个 alias
  • 之因此可以用颜色显示nologin 是由于
  • 这个 alias 包含了 --color=auto 自动显示颜色的设置

  • 参数 -c 能够统计包含nologin的数据行的数量
  • 这里是18,表示有18行

  • 参数 -n 能够显示行号
  • 如图最左边,暗绿色显示的数字就是每一行的行号

  • 如图,参数 i 能够不区分大小写
  • 下面的搜索结果,NOLogin 和 nologin 都搜索出来了
  • 若是不加 i 参数,会严格按照大小写来搜索

  • 参数 v 是取反的意思
  • 通常来讲,grep 'nologin' passwd 是把包含nologin的数据行筛选出来
  • 如图,使用 v 参数,那么效果就是把不包含nologin的数据行筛选出来
  • 就是把与筛选条件相反的结果筛选出来的意思

  • 参数 -r 能够遍历目录里面全部的子文件和子目录里面的文件
  • grep 通常是对文件内容进行筛选,使用对象是文件不能是目录
  • 可是 r 参数的意思是,能够遍历目录里面的全部文件和子目录里面的文件内容
  • 而后筛选出全部包含关键词的数据行
  • 因此使用 r 参数就能够对目录进行 grep 操做
  • 如图,grep -r 'root' /etc/ > /tmp/grep.log
  • 意思是,遍历/etc/目录里面全部文件,包括子目录里面的文件
  • 筛选出全部的包含关键字 'root' 的数据行
  • 而后重定向,也就是说写入 grep.log 文件里面
  • 而后 grep passwd /tmp/grep.log
  • 意思是从 grep.log 文件里面筛选出全部包含 passwd 关键字的数据行

  • 关于grep后面的关键字加不加引号

  • 还有一个参数 A+数字n,能够显示关键字数据行和下面的n行
  • 例子,如图, grep -nA2 'root' passwd
  • 这条命令会把包含关键字 root 的数据行都筛选出来
  • 由于A后面的数字是2,因此还会显示root数据行下面的两行
  • 如图,第一行数据行包含root,这一行下面的两行也会筛选出来
  • 而后找到第二行包含root关键字的数据行
  • 而后把第二行root数据行下面的两行也筛选出来,以此类推

  • 除了参数 A,还有参数 B
  • 区别是,A+数字n 能够筛选出关键字行和该行的下面 n 行
  • 而 B+数字n 就能够筛选出关键字行和该行的上面 n 行
  • 如图,第一行root数据行上面没有数据,由于这一行上面原本就没有数据行了
  • 第二行root数据行和该行的上面两行数据都被筛选出来了

  • 还有参数 C+数字n
  • A是筛选下面n行,B是筛选上面n行,C能够上下各n行
  • 如图,grep -nC2 'root' passwd
  • 首先,能够把 root 关键字的行筛选出来
  • 而后还能够把每一行 root数据行 的上面2行和下面2行也筛选出来
  • 第一个root数据行由于上面没有数据因此没有显示
  • 第二个root数据行的上下2行都被筛选出来了

  • grep '[0-9]' passwd
  • 其中 [0-9] 表示0到9里面任意一个数字
  • 这个筛选条件表示全部数据行里面,任何一行存在0-9任意一个数字的数据行都会被筛选
  • 也就是说,任何存在数字的数据行都会被筛选
  • 若是想筛选出不存在数字的行
  • 可使用 grep -v '[0-9]' passwd
  • 参数 v 是取反,这样就会把没有数字的行筛选出来

  • 上图的筛选条件是 '^#'
  • 符号 ^ 表示 以...开头,因此 ^# 就表示以 # 开头
  • 这条命令的意思就是 筛选出以 # 开头的数据行
  • 能够看到,下面的数据行全都是以#开头的
  • 若是使用 -v 参数就能够把 不以#开头的行筛选出来

  • 符号 ^ 有两种含义,在方括号[]外面的含义是 以...开头
  • 在方括号[]里面的含义是 非 的意思
  • 如图,grep '[^0-9]' inittab
  • 这里 ^ 的位置是在方括号[]里面,因此意思是 非
  • 那么 [^0-9] 就表示 非 0-9 任意一个数字
  • 也就是非数字的意思
  • 看下面的筛选内容,能够看到,非数字全都红色高亮显示
  • 而数字则是白色,说明全部数字都不是关键字

  • 如图,grep '^[^0-9]' inittab
  • 这里筛选条件是 '^[^0-9]'
  • 由于 ^ 在方括号[]外面时候的含义是 以...开头 的意思
  • [^0-9] 是非数字的意思
  • 因此 '^[^0-9]' 就表示 以非数字开头的数据行
  • 看下面筛选出来的数据行,全都是非数字开头的
  • 如图,使用 v 参数取反结果
  • 能够筛选出 以数字开头的数据行
  • 还有一点,使用取反操做的时候,筛选关键字是不会高亮显示的
  • 非取反操做的时候才会高亮显示关键字

  • 如图,筛选条件是 'r.o' ,符号 . 表明一位字符
  • 一位字符能够是任意字符
  • r.o 意思就是 r 开头,o 结尾,中间能够是任意一位字符
  • 看下面的筛选结果
  • 高亮显示的关键字,有 roo,rao,r.o
  • 全部关键字都是r开头o结尾,中间任意一位字符

  • 这里的筛选条件是 'o*o'
  • 右边的 o 表示关键字是以 o 结尾的
  • 左边的 o* 表示任意个 o
  • o* 表示 0-n 个 o ,若是为0,就是没有 o
  • 结合起来,筛选条件意思是,关键字就是 任意个o + o
  • 看下面筛选结果,有一个o的,这就是左边o*为0个o的结果
  • 有两个o的,这就是左边 o* 为 1 的结果
  • 左边也能够有更多个o,若是有这样的数据行的话

  • 还能够把 * 和 . 结合起来使用
  • 符号 . 表明一位字符
  • 符号 x* 表明 0-n 个 x
  • 那么 .* 就表明 0-n 个一位字符,也就是任意长度的字符
  • 如图,筛选条件是 'aming.*bash'
  • 这表示,以 aming 开始
  • 以 bash 结束
  • 中间是 .* 表明任意长度的字符
  • 符合这个格式的关键词数据行会被筛选出来
  • 结果就是 aming开始,而后任意字符串,而后bash结尾的关键字

  • 还可使用花括号{}指定范围
  • 如图 'o{2}' 表示筛选出o连续出现两次的关键字的数据行
  • 之因此加转义字符 \ 是由于在grep里面,花括号{}是不识别的
  • 想令花括号{}被识别产生做用就须要转义一下

  • 使用 egrep 就能够不用转义,由于 egrep 是支持花括号的
  • 如图,使用 egrep 的时候,就不须要写转义符
  • 如图 grep -E 就至关于在使用 egrep
  • 参数 -E 就表示使用的是 egrep
  • 因此也能够不须要转义字符

  • 如图,能够把 oo 用小括号括起来,表示这是一个总体
  • 后面使用{2}表示连续出现两次
  • 那么 oo 连续出现两次就是 oooo
  • 看筛选结果,关键字就是 oooo
  • 使用小括号的时候,也须要用 -E 或者 egrep,由于grep不识别小括号
  • 否则就须要用转义字符转义小括号

  • 特殊符号 + 做用跟 * 差很少
  • 它们的区别是 *表示0-n ,+ 表示 1-n
  • 星号最小个数是0,也就是没有,+的最小个数是1,也就是最少要有一个相关字符
  • 如图,关键字条件是 'o+t'
  • o+ 表示关键字左边最少有 1个 o 或者 n个 o
  • 右边以 t 结尾
  • 看筛选结果,oot, 左边是2个o,右边以 t 结尾
  • 还有一个问题,egrep也是不识别 + 号的,使用须要用转义字符
  • 或者使用 egrep 或 -E 就能够直接识别,不用转义

  • 如图,特殊符号 ? 号, 表示 0 或 1
  • 上图,o? 表示 0个o 或者 1个o
  • 意思就是右边以 1o 结尾,左边能够有0个或者1个o
  • 看下面筛选结果有 1o,o1o
  • 1o 就是左边有0个o,o1o就是左边有1个o
  • 要使用?号,也是须要用 egrep 或者 -E

  • 符号 | 是 或 的意思,使用这个功能也须要使用 egrep 或者 -E 参数
  • 如图,第一行命令,筛选 root或者Bus或者997的关键字出来
  • 下面能够看到,root,Bus,997关键字都高亮显示了
  • 第二条命令,-E后面添加了一个 i 参数
  • 意思是忽略大小写
  • 筛选条件里面的 bus或者root,能够筛选出任意字母是大写或者小写的
  • 好比这里,筛选条件写了 bus
  • 可是筛选结果出现了 Bus ,若是不用 i 参数
  • bus里面任意一个或者几个字母若是跟条件处的大小写不一致
  • 就不会被筛选出来,如今能够筛选任意字母大小写的 bus 出来
相关文章
相关标签/搜索