文本处理工具grep和sed的用法

正则表达式:Regual Expression ReGEXP

基本正则表达式:BRE

扩展正则表达式:ERE


作用;文本搜索工具,根据用户指定的”模式(PATTERN)“对目标文本进行逐行匹配检查,并打印匹配到的行。

模式(PATTERN):由正则表达式的元自负及文本字符所编写出的过滤条件。

     grep[OPTIONS]PATERN[FILE]

     grep[OPTIONS][-e PATTERN][FILE]

            [OPTIONS]:

                        --color=auto:对匹配到的文本着色高亮显示(CentOS7中默认)

                        -i:忽略字符大小写

                        -v:显示没有被匹配到的行

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

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

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

                        -A#:显示被匹配到的行和其后#行

                        -B#:显示被匹配到的行和其前#行

                         -C#:显示被匹配到的行前后#行

                元字符:

                          字符匹配:

                                 .:匹配任意单个字符

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

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

                               [:digit:]数字

                               [:lower:]:小写字母

                               [:upper:]:大写字母

                               [:alpha:]:字母

                               [:alnum:]:字母和数字

                               [:punct:]:标点符号

                          

                         次数匹配:用于指定其前面字符出现的次数(默认为贪婪模式)

                               *:匹配其前面字符任意次

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

                              \?:匹配其前面的字符1次或0次

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

                              \+:匹配其前的字符至少一次

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

                         

                          位置锚定:

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

                              $ :行尾锚定,用于模式的最右侧

                              ^PATTERN$:用模式匹配整行

                             ^$:空白行

                             ^[[:space:]]$:匹配空行或者含有空白字符的行


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

                            \<或\b:锚定词首,位于模式的左侧

                            \>或\b:锚定词尾,位于模式的右侧

                            \<PATTERN\>:匹配完整单词

                          分组:\(  \) 将一个或多个字符捆绑在一起

                                  后向引用:

                                          \1:引用第一个左括号一级与之对应的右括号所包含的内容

                                          \2:

                                            .

                                            .

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

           例:显示/etc/passwd文件中包含root字符的

                ~]# grep "root" /etc/passwd

            wKioL1Z-SuPBQqhLAAAMbk7RGJA350.png

          例:显示/etc/passwd文件中以/bin/bash结尾的行;

                                 ~]#  grep "/bin/bash$" /etc/passwd

            wKiom1Z-Sx_TYNOxAAANcoyqukU852.png

                         例:显示/etc/passwd文件中包含大写字母的行:

                                        ~]# grep "[[:upper:]]" /etc/passwd

wKioL1Z-TC2A__SBAABzejeY-g4472.png                         例:找出/proc/meminfo文件中,所有以大写或小写S开头的行

                                       ~]# grep "^[Ss]" /proc/meminfo

                  wKiom1Z-TMKxvJwLAAAZowgYAis005.png

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

                                     ~]# grep "\<.*\>()" /etc/rc.d/init.d/functions

         wKioL1Z-Thqi7w6jAABBfsd03y0864.png

                       例: 找出/etc/passwd文件中的两位数或三位数

                                   ~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd

wKioL1Z-T0SQDN8jAABr4IJfndY742.png

   egrp:支持扩展的正则表达式实现类似于grep文本过滤功能(egrep -E)

                         

                     元字符:

                           字符匹配:与基本正则表达式相同:

                                    .:匹配单个字符

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

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

                                    .

                            次数匹配与基本正则表达式有所不同:

                                  *:匹配其前字符任意次

                                 ?:匹配其前字符0次或1次

                                  +:匹配其前字符至少1次

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

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

                            位置锚定与基本正则表达式用法相同

            、

                             分组:

                                      ():分组

                             后向引用:

                                         \1

                                          .

                              或者:

                                        |

                                    a|b:匹配出a或者b


      fgrep:不支持正则表达式元字符,当无需用到元字符去编写模式时,使用fgrep更好


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

           ~]# egrep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg

wKioL1Z-UIPxHoN1AAA0rNlZTt8363.png 

                   例:显示当前系统上root、centos或user1用户的相关信息                

                              ~]#  egrep "^root|^centos|^user1" /etc/passwd

   wKiom1Z-UTfjCeHKAAAVXMJIA8k030.png

       例:使用echo命令输出一绝对路径,使用egrep取出基名

                                ~]# echo /etc/sysconfig/ | egrep -o "[^/]+/?$"       

         wKiom1Z-UsjTEDn3AAAJ8DiLOqI012.png

                    例:同上取出其路径名

                                ~]#  echo /etc/sysconfig/ | egrep  -o  "^/[[:alnum:]]+"

          wKioL1Z-U0WxSIMoAAAIR533T_M027.png


                                                                                                                                                                                                                                                                                                

sed查找机制:将目标文本中的内容逐行复制到sed的模式空间(pattern pace工作车间)中并在模式空间中对文本进行匹配处理,如果模式空间中的内容能陪匹配到之后对匹配到的文本内容进行编辑然后把编辑的结果输出,如果模式空间中的内容不能被匹配到就直接输出至标准输出。

wKioL1Z-XF7C7G6wAABIk7SD03U155.png


sed命令的用法:

                sed[OPTIONS]...'script'[input-file]...

                     script:地址定界编辑命令(地址定界和编辑命令之间没有空格)

                     常用选项:

                         -n:静默模式,不输出模式空间中的内容至屏幕

                         -e script :多点编辑

                         -f /PATH/TO/SED_SCRIPT_FILE

                                 每行一个编辑命令;

                         -r:支持使用扩展的正则表达式

                         -i:直接编辑原文件


                   地址定界:

                         (1):空地址:对全文进行处理

                         (2):单地址:

                                          #:指定行

                                          /pattern/:被此模式匹配到的每一行

                         (3):地址范围:

                                          #,#:从第#行到第#行

                                          #,+#:从第#行到第#+#行,包含第一行。

                                          #,/pattern/:从第#行到能被匹配到的行

                                         /pattern1/,/pattern2/:从模式一匹配到的行到模式二匹配到的行

                        (4):步进:~

                                         1~2:所有奇数行

                                         2~2:所有偶数行

                    编辑名令:

                              d:删除。

                              p:显示模式空间中的行。

                              a\text:在匹配行后面追加文本text。

                              i\text:在匹配到的行前插入文本text。

                              c\text:把匹配到的行替换为此处指定的文本”text“。

                              w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中。

                              r /PATH/TO/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面,                                                                       文件合并。

                              =:为模式匹配到的行打印行号。

                              !:条件取反:

                                          地址定界!编辑命令

                              s/pattern/text/:查找替换,分隔符可自行制定,用text替换匹配到的内容

                                          替换标记:

                                                   g:全局替换

                                                   w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中

                                                   p:显示替换成功的行 



         例:删除/boot/grub2/grub.cfg文件中所有以空白字符开头的行的行首的所有空白字符  

                              ~]# sed  ‘s@^[[:space:]]\+@@‘  /boot/grub2/grub.cfg


         例:删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符

                               ~]# sed ‘s@^#[[:space:]]*@@’ /etc/fstab  

         例:输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname

                               ~]#  echo /var/log/messages | sed 's@[^/]\+$@@'



你可能感兴趣的:(linux,正则表达式,grep,sed)