什么是正则
1、grep 的常用选项
grep 是用来过滤指定关键词的。具体操作,见下图, grep 有个比较好的特点,自带颜色在过滤关键词上。不加颜色的话,就使用绝对路径,见下图, 不加颜色的话,看起来比较费劲。 接着来看一下各个选项的作用,见下图, -c 查看行数,-n 显示行号,-i 不区分大小写的话,先来编辑一下 passwd 文件,进入下图, 将上图中红色框框的位置,改动三个字母为大写字母 NOL ,保存后退出。接着下图操作, 让 -n 与 -ni 做对比之后,不难发现, -ni 的结果多了第2行的大写的 NOLogin 。-i 的作用就是不区分大小写。接着查看其他选项的作用,见下图, -v 是取反的作用,上面的命令就是列出不含”nologin“的行项,可以看最前面的行数与上个命令结果做对比,可以发现是互补的。接着查看 -r 的作用,见下图, 包含 root 的结果内容太多,不一一截屏。 以上说明,grep -r 可以作用在目录上,查找目录及所有的子目录内包含”root“的内容,去掉 -r 就只能作用在文件上。 如果想知道 -r 选项这边有没有把 passwd 内的 root 列出来,可以按下图操作, 将 -r 的结果内容重定向到文件 /tmp/grep.log 中,然后过滤出包含 passwd 的内容。 接着查看其他选项,见下图, -A 后面跟数字,过滤出符合要求的行以及下面n行 -B 同上,过滤出符合要求的行以及上面n行 -C 同上,同时过滤出符合要求的行以及上下各n行 以上就是 grep 的常用选项。
2、grep 正则表达式
先查看下图例子, 输出的结果全部包含 0-9 的数字,[ ] 表示一个范围。接着使用 -v 选项来查看没有包含数字的结果,见下图, 结果显示 passwd 文件里面完全没有不包含数字的行项目,接着在文件 inittab 里面有查到不包含数字的行项目,缺少9行和10行,说明这两行里面包含数字,可以使用 vim /etc/inittab 命令进入验证结果,见下图, 在 vim 里面输入”:set nu“,可以显示行数,然后就可以看到9、10行里面确实包含数字。
^ 表示以后面跟的内容开头,见下图例子, inittab 文件里面全部是以#开头的文件,前面的行数都是连续的,并且可以和上上图的内容验证。现在要改动 inittab 文件里面的内容,先拷贝一份文件到当前目录下,这里需要注意的是,改动的内容必须是拷贝的文件,不能去动原文件。这是比较安全的做法,系统自带的文件不能轻易更改,否则会导致系统启动不了。 执行命令 vim inittab ,回车,见入下图, 在红色框框中随机增加一行不以#开头的内容,保存后退出。接着下图操作, 可以看到,当前目录下的 inittab 文件中14行的内容没有出现,说明第14行不符合要求,这一行就是刚刚改动的不以#开头的行项目。接着加上 -v 选项来查看一下,见下图, 可以看出,14行就是不以#开头的行。以#开头的行都是解释说明的内容,没有实际意义,以后工作中想避开这些解释说明的内容,就可以使用此方法。 现在还是在文件 inittab 中,更改一下内容,输入命令 vim inittab ,回车,见下图, 更改上图红色框框的内容,保存后退出。接着往下操作, 结果是一样的。接着操作其他内容,见下图, 可以看到,命令结果除了数字3和5,其余全部显示红色。说明 [^0-9] 表示的是非 0-9 的一个字符。接着验证一下,再次更改一下文件 inittab 的内容,见下图, 增加上图红色框框的内容,保存后退出。接着往下操作, 可以看到,新增加的行项目里面,只有a符合要求,a是红色的。再往下操作, 上图中,^[^0-9] 表示的是以非数字开头的行。加上行数,再查看一遍,见下图, 总结一下 ^ 的作用,把 ^ 放在 [ ] 里面,表示取反,非的意思。放在 [ ] 外面就是以后面的内容开头。
接着看下图, 要想知道上图的 'r.o' 什么意思,先进入 passwd 文件更改一下内容,见下图, 增加上图两行红色框框的内容,保存后退出。接着往下操作, 对比一下两条命令的结果,后面编辑的 rao 和 r>o ,也都能被匹配到。所以 'r.o' 里面的 . 表示一个任意的字符。那么能不能匹配到 . 呢?接着做实验,先更改一下 passwd 文件的内容,见下图, 把 > 改成 . ,保存后退出。重新过滤,见下图, 也是可以匹配到 . 的。 还有一个特殊符号 * (星号),操作之前还是先更改一下 passwd 文件的内容,见下图, 将上图红色框框的内容更改一下,保存后退出。接着往下操作, 可以看出 'r.o' 的结果,除了大写的 O ,其余的小写 o 全部出现了。所以 * (星号)的意思是, (星号) 右边的字符表示需要匹配的内容,左边的字符表示重复 0-n 次,n 是一个随意的数字。'oo' 中的0次就表示只有一个 o ,所以该命令的结果是,一个 o 和多个 o ,都匹配了。简单来说,'oo' 表示 n 个 o 。 接着把 . 和 (星号)放在一起,做实验,见下图, 可以看到所有的字符都匹配到了,说明‘.’表示任意的任意字符,0个也可以。假如想匹配其中的一行字符,具体操作见下图, 接着操作花括号 { } ,\ (脱义符号)把它原本的含义去掉,见下图, 在 grep 当中,直接使用 { } 花括号,是没有任何意义的,就单纯表示为花括号。而在正则当中,{ } 花括号表示的是一个范围,真正的写法是 grep 'o{2}' passwd ,其中的 'o{2}' 表示o出现2次。但是命令直接这样写的话,结果又不能匹配,需要做一个脱义。正确的写法就是上图出现结果的命令 grep 'o{2}' passwd 。而这个命令中4个 o 的字符为什么可以识别到呢,实际上应该理解为分别的2个 o 。后面还可以有另外一种写法,grep 'o{0,3}' passwd ,表示1到3个 o 都是可以匹配的。不过这种写法,一般很少用到。 如果觉得上面的 \ (脱义符号)看着不舒服的话,可以使用 egrep 命令,这样就不需要用到 \ (脱义符号)了。见下图, 还可以使用 grep -E 命令,这个命令和 egrep 命令的效果是一样的,并且都不需要用到 \ (脱义符号)。还有一种写法,见下图, 上面的 '(oo){2}' 表示 oo 出现2次,就是 4 个 o 。 综上,{ } 花括号表示前面字符的重复范围。 接着介绍一个特殊符号 + (加号),它与 (星号)挺像的,见下图, 上图中的 'o+o' ,表示+号前面字符的1次或多次,它与 (星号)的差别在于,(星号)表示的是 0 次或多次。当然,这边把后面的字符 o 换成其他字符,应该会比较清晰,见下图, 接着介绍 ?号,见下图, ?号表示 ?号前面字符的重复次数为0次或1次。上面的例子不够特殊,自己写几个上去,输入命令 vi passwd ,回车,见下图, 更改上图两个红色框框的内容,保存后退出。接着往下操作, 可以验证,?表示 ?前面的字符重复0次或1次。 接着介绍 |(竖线),它表示或者的意思,可以多个字符串操作,见下图, 也可以不区分大小写,加上 -i 选项,见下图,
总结: . 表示任意一个字符 (星)表示0个或多个前面的字符 . (点星)表示通配 { } 表示前面字符的范围
- (加号)表示1个或多个前面的字符 ?表示0个或1个前面的字符 | 表示或者 ^ 表示以后面跟的内容开头 [ ] 表示一个范围 [^ ] 表示取反,就是非的意思