6.运维核心技能-grep命令与基本正则表达式

文本处理工具:

       linux上的文本处理三剑客

              grep egrep fgrep:文本过滤工具

                      grep:支持基本正则表达式,-E

                      egrep:扩展正则表达式,-G

                      fgrep:不支持正则表达式

              sed:文本编辑工具

              awk:Linux上的实现为gawk,文本报告生成器(格式化文本)。

              正则表达式:RE

                      由一类特殊字符及文本字符所编写的而模式,其中有些字符不表示其字面意义,用于表示控制或通配的功能。

                             分为两类:

                                           基本正则表达式:BRE

                                          扩展正则表达式:ERE

                     元字符:\(hello[[:space:]]\+)\+

              grep:文本搜索工具,过滤出指定字段的行

                    模式:由正则表达式的元字符以及文本字符所编写出的过滤条件

                    正则表达式引擎:

                    grep [OPTIONS] PATTERN [FILE...]

                    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]                    

例子:

root@myEcs ~]# grep 'UUID' /etc/fstab 
UUID=1114fe9e-2309-4580-b183-d778e6d97397 /                       ext4    defaults        1 1
[root@myEcs ~]# 

                      选项:

                               --color=auto: 对匹配到的文本着色,做高亮显示。

                               -i:忽略字符大小写。

                               -o:仅仅显示匹配到的字符串本身。

[root@myEcs ~]# grep 'UUID' /etc/fstab 
UUID=1114fe9e-2309-4580-b183-d778e6d97397 /                       ext4    defaults        1 1
[root@myEcs ~]# grep -o 'UUID' /etc/fstab                                                           //只显示匹配到的字符串本身
UUID
[root@myEcs ~]# 

                           -v:显示不能被模式匹配到的行

[root@myEcs ~]# grep 'UUID' /etc/fstab 
UUID=1114fe9e-2309-4580-b183-d778e6d97397 /                       ext4    defaults        1 1
[root@myEcs ~]# grep -v 'UUID' /etc/fstab                                                            //显示关键自之外的行

#
# /etc/fstab
# Created by anaconda on Thu Jul 11 02:52:01 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
[root@myEcs ~]# 

                          -E:表示支持使用扩展的正则表达式元字符。

                              -q:静默模式,不输出任何信息

root@myEcs ~]# grep -q 'UUID' /etc/fstab 
[root@myEcs ~]# echo $?
0
[root@myEcs ~]# grep -q 'UUIID' /etc/fstab 
[root@myEcs ~]# echo $?
1
[root@myEcs ~]# 

 

                             -A3:后3行

                             -B3:前3行

                             -C3:前后各3行

         基本正则表达式的元字符:

               字符匹配:

                    . :匹配任意单个字符

[root@myEcs ~]# grep r..t /etc/passwd           //以r开头t结尾中间任意匹配两个字符
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

  

                   [] :匹配指定范围内的任意单个字符。

                   [^]:匹配指定范围外的任意单个字符。

                         [a-z]:匹配a-z任意单个字符 

                         [A-Z]:匹配A-Z任意单个字符

                         [a-z0-9]:匹配a-z或0-9任意单个字符

                         [abcxyz]:匹配abcxyz任意单个字符

                         [[:upper:]]:所有大写字母

                         [[:digit:]] :匹配所有数字

                         [[:lower:]]:匹配任意小写字符

                         [[:upper:]]:匹配任意大写字符

                         [[:alpha:]]:匹配所有字母

                         [[:alnum:]]:所有的字母和数字

                         [[:space:]]:所有的空白字符

                         [[:punct:]]:标点符号     

               匹配次数:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪恋模式

                        *:匹配其前面的字符任意次;0,1,多次;...

                            例如:grep "x*y"  file...

                                    abxy:匹配,x匹配了一次

                                    aby:匹配,x匹配的0次

                                    xxxxy:匹配,x匹配了4次

                                    yab:匹配,x匹配了0次

[root@myEcs tmp]# grep "x*y" a.txt     //匹配x 0,1,多次。
abxy
aby
xxxxy
yab
[root@myEcs tmp]# 

 

                      .*:匹配任意长度的任意字符

                      \?:匹配其前面的字符0次或1次;即其前面的字符是可有可无的。

[root@myEcs tmp]# grep "x\?y" a.txt    //匹配x 0次或1次
abxy
aby
xxxxy
yab
[root@myEcs tmp]# 

 

                   \+:匹配其前面的字符一次或者多次,即其前面的   要出现至少一次。不包含0次  

[root@myEcs tmp]# grep "x\+y" a.txt 
abxy
xxxxy
[root@myEcs tmp]# 

               \{m\}:匹配前面字符m次

[root@myEcs tmp]# grep "x\{3\}y" a.txt    //x只能匹配3次
xxxxy
[root@myEcs tmp]# 

 

                   \{m, n\}:匹配其前面的字符至少m次至多n次。

                               \{0,n\}:至多n次

                               \{M,\}:至少m次,多了不限制

[root@myEcs tmp]# grep "x\{2,4\}y" a.txt 
xxxxy
xxy
xxxy
[root@myEcs tmp]#             

               位置锚定:

                   ^:行首锚定;用于模式的最左侧

[root@myEcs tmp]# grep ^root /etc/passwd
root:x:0:0:root:/root:/bin/bash
rootket:x:1009:1010::/home/rootket:/bin/bash
[root@myEcs tmp]# 

              ^PATTERN$:用于PATTERN来匹配整行

                  ^$:匹配空白行。

                  ^[[:space:]]*$:表示空行或者空白字符的行

                  $:行尾锚定

 

[root@myEcs tmp]# grep root$ /etc/passwd
user4:x:1010:1011::/home/user4:/bin/chroot
[root@myEcs tmp]# 

                  单词锚定:非特殊字符组成的连续字符(字符串)都称为单词。

                        \<或者\b:词首锚定

[root@myEcs tmp]# grep "\<root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rootket:x:1009:1010::/home/rootket:/bin/bash
[root@myEcs tmp]# 

                   \>或者\b:词尾锚定

[root@myEcs tmp]# grep "root\>" /etc/passwd    
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user4:x:1010:1011::/home/user4:/bin/chroot
[root@myEcs tmp]# 

                   \<str\>:精确匹配单词

[root@myEcs tmp]# grep "\<root\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@myEcs tmp]#   

练习:

      1.显示/etc/passwd下不以bin/bash结尾的行。

           [root@myEcs tmp]# grep -v "bin/bash$" /etc/passwd

      2.找出/etc/passwd中的两位数或三位数。

           [root@myEcs tmp]# grep "\<[[:digit:]]\{2,3\}\>" /etc/passwd

      3.找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行。

           [root@myEcs tmp]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg 

      4.找出"netstat -tan"命令结果中以"LISTEN"后跟0,1或多个空白字符结尾的行。

         [root@myEcs tmp]# netstat -tan |grep "LISTEN[[:space:]]*$"

 

            分组及引用                      

                   \(xy\)*ab:表示捆绑的xy可以出现0,1,多次;

                  注意:分组括号中的模式匹配到的内容,会被正则表达式,引擎自动记录于内部的变量中,这些变量为:

                       \1:模式从左侧起,第一个括号之间的模式所匹配到的字符

                       \2:模式从左侧起,第二个括号之间的模式所匹配到的字符

                       \3:模式从左侧起,第三个括号之间的模式所匹配到的字符

                       ...

                  例如:文本b.txty有如下内容

                        He loves his lover.
                        He likes his lover.
                        She likes her liker.
                        She loves her liker.

[root@myEcs tmp]# grep "\(l..e\).*\1" b.txt   //如果后面匹配到了前面相同的模式,就显示出来
He loves his lover.
She likes her liker.
[root@myEcs tmp]# 

 

root@myEcs tmp]# grep "^\(r..t\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash
rootket:x:1009:1010::/home/rootket:/bin/bash
[root@myEcs tmp]# 

            后项引用:引用前面的分组括号中的模式所匹配到的字符。

  egrep:

              支持扩展正则表达式。

              语法:

                   grep [OPTIONS] PATTERN [FILE...]
                   grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

                                                                                   

              选项:-i,-o,-v,-q,-A,-B,-C

                      -G:支持基本正则表达式

             扩展正则表达式的元字符:

                      字符匹配:

                            .:匹配任意单个字符

                           []:匹配指定范围内的任意单个字符

                           [^]:匹配指定范围外的任意单个字符

                                 [a-z]:匹配a-z任意单个字符 

                                 [A-Z]:匹配A-Z任意单个字符

                                 [a-z0-9]:匹配a-z或0-9任意单个字符

                                 [abcxyz]:匹配abcxyz任意单个字符

                                 [[:upper:]]:所有大写字母

                                 [[:digit:]] :匹配所有数字

                                 [[:lower:]]:匹配任意小写字符

                                 [[:upper:]]:匹配任意大写字符

                                 [[:alpha:]]:匹配所有字母

                                 [[:alnum:]]:所有的字母和数字

                                 [[:space:]]:所有的空白字符

                                 [[:punct:]]:标点符号                                

                      次数匹配:

                                *:任意次,0,1或多次

                                ?:0次或1次,其前的字符可有可无

                                +:其前字符至少一次

                                {m}:匹配其前的字符m次

                                {m,n}:至少m次,至多n次

                                       {0,n}:至多n次

                                       {m,}:至少m次

                      位置锚定:

                               ^:行首锚定

                               $:行尾锚定

                               \<, \b:词首锚定

                               \>, \b:词尾锚定

                      分组及引用:

                              ():分组;括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;

                                后项引用:\1, \2, \3, ...

                  或:

                           a|b;a或者b

                           例如:

                                C|cat:表示C或者cat

                                (C|c)at:表示Cat或者cat         

l练习:使用扩展正则表达式。

      1.显示/etc/passwd下不以bin/bash结尾的行。

           [root@myEcs tmp]# egrep -v "bin/bash$" /etc/passwd

      2.找出/etc/passwd中的两位数或三位数。

           [root@myEcs tmp]# egrep "\<[[:digit:]]{2,3}\>" /etc/passwd

      3.找出/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行。

           [root@myEcs tmp]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg 

      4.找出"netstat -tan"命令结果中以"LISTEN"后跟0,1或多个空白字符结尾的行。

          [root@myEcs tmp]# netstat -tan | egrep "LISTEN[[:space:]]*$" 

      5.找出/tmp/b.txt文件中,所有以大写或者小写s开头的行;至少两种实现方式。

         ~]# egrep -i "^s" b.txt  //不区分大小写

[root@myEcs tmp]# egrep "^(s|S).*" b.txt   //方法二
she likes her liker.
She loves her liker.
swapCached:            0 kB
SwapTotal:             0 kB
swapFree:              0 kB
Shmem:             51668 kB
slab:              89320 kB
SReclaimable:      71840 kB
sUnreclaim:        17480 kB
[root@myEcs tmp]# egrep "^[sS].*" b.txt     //方法三
she likes her liker.
She loves her liker.
swapCached:            0 kB
SwapTotal:             0 kB
swapFree:              0 kB
Shmem:             51668 kB
slab:              89320 kB
SReclaimable:      71840 kB
sUnreclaim:        17480 kB
[root@myEcs tmp]# 

  6.显示当前系统上root,centos或user1用户的相关信息

[root@myEcs tmp]# cat /etc/passwd|egrep "\<^(root|centos|user1)\>"
root:x:0:0:root:/root:/bin/bash
user1:x:1007:1008::/home/user1:/bin/bash
centos:x:1012:1013::/home/centos:/bin/bash
[root@myEcs tmp]#

      7.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行

[root@myEcs tmp]# egrep "^[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions   
checkpid() {
__kill_pids_term_kill_checkpids() {
__kill_pids_term_kill() {
__pids_var_run() {
__pids_pidof() {
daemon() {
killproc() {
pidfileofproc() {
pidofproc() {
status() {
echo_success() {
echo_failure() {
echo_passed() {
echo_warning() {
update_boot_stage() {
success() {
failure() {
passed() {
warning() {
action() {
strstr() {
is_ignored_file() {
convert2sec() {
is_true() {
is_false() {
apply_sysctl() {
[root@myEcs tmp]# 

      8.使用echo命令输出一个绝对路径,使用egrep取出基名。

[root@myEcs tmp]# echo /etc/sysconfig/|egrep -o "[^/]+/?$"
sysconfig/
[root@myEcs tmp]# 

      9.找出ifconfig命令结果中的1-255之间的数值

       [root@myEcs tmp]# ifconfig |egrep -o "[1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]"

      10.找出ifconfig中的ip地址

      11.添加用户bash,testbash,bsaher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行

 

                    

 

posted @ 2020-04-19 20:35  附庸风雅  阅读(90)  评论(0)    收藏  举报