LINUX系统下的shell命令---grep、sed、awk

1)grep文本过滤命令

   1、grep基本认识

       (Global  search  regular expression and  print  out the  line全局搜索研究正则表达时并显示出来)。grep命令是一种强大的文本搜索工具,根据用户指定模式,对目标文本进行匹配检查,打印匹配到的行。

    2、语法:  grep   匹配条件    处理的文件名

            匹配条件可以是:搜索的字符串、数字等,也可以使用正表达式,通配符等等

           处理的文件名可以是:目录/文件 或 .

    3.参数:

           

    4、grep中字符的匹配次数设定      

             *                字符出现0到n次

          ?               字符出现0或1次

           +                字符出现1到n次

            {4}              字符出现4次

         {1,5}            字符出现次数,最少1次,最多5次

         {m,}            字符出现次数最少m次

         (xy){4}          字符xy出现次数为4次

    5.示例:   

  •     grep  root   pass                 ##查看pass文件中含有root字符的结果

         

  •     grep  ^root  pass                 ##查看开头为root的结果

         

  •    grep  root$  pass                 ##显示以root结尾的行的结果

        

  •    grep  -i  root   pass                ##显示的时候,忽略大小写

        

  •   grep  -E  "root|ROOT"  pass        ##显示为root或者ROOT的结果(注意。使用-E时,是有两个条件)    

       

  •    grep root pass | grep  -E "^root|root$" -v    ##在root行中,显示除了开头和结尾是root的。(-v表示反向选择)

      

  •     grep  -E '\<...r' pass                       ##显示以r结尾(但r不是最后一个字符)且前面是三个字母的(\<表示r前面只能有三个字符)

        

  •    grep  -E "\<...t\>" pass          ##高亮显示的字母一定是4个,且最后一个是t

        

  •     grep ....t pass                     ##显示结果如下:

        

  •     grep -E "\<[[:alpha:]]{3}\>|[[:digit:]]{1,}"   xniu                     ##显示含有三个小写字母或者含数字的行  

 

  •     grep -E 'xa*y'  test                                                               ##有结果可知,*表示xy中见a的个数为0到n   

          

 

  •     grep -E 'xa?y'  test                                           ##由结果可只,?表示a的个数为0或1个

 

          

 

  •      用 + 表示a的个数为1到n;{4}表示a的个数只能为4个

 

         

  

2)sed行编辑器

  1、 sed相关介绍:

       (stream  editor)是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取特定工作。用来操作纯ASCLL码的文本。处理时,把当前的行存储在临时缓冲区中,称为模式空间(pattern space),可以指定仅仅处理哪些行;处理完成时,把缓冲区的内容送到屏幕;接着下一行的处理。
   2、语法:sed  [options]      'command'   file(s) 

                         sed    [options]    -f  scriptfile   file(s)                          
   3、常用参数

         -n∶使用安静(silent)模式。在一般情况下,所有来自 STDIN的资料一般都会被列出到屏幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来

         -e∶直接在指令列模式上进行 sed 的动作编辑;

         -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;

         -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

         -i∶直接修改读取的档案内容,而不是由萤幕输出。       

  4、常用模式:       

 

 

     p           显示模式  

     -d           删除模式  

      a            向下插入模式  

      i            向上插入模式    

       c           替换模式     

      w           写入文件模式    

      r             插入文件模式   

      =            添加行号

  5、操作示例:

  •     分别显示fstab文件中4到6行、第四和六行、第六行的内容

       

  •     显示除了第6行的所有行 (在进行取操作时,在p前面添加)

       

  •      sed    -n   '/^#/p'   fstab              ##显示以#开头的内容 (其中//中添加关键字);-n  表示只显示最终结果;若没有n时fatab中的内容会显示出来

       

  •     cat -n fstab | sed '5,7d'    删除5到7行

      

  •   cat -n fstab | sed  -e '5d;7d'    删除第五和第七行

       

  •     sed  '/^#/d' fstab                          ##删除#开头的所有行

       

  •   sed '/UUID/aword\nhello' file          ##在file文件UUID的下一行添加word;再下一行中添加hello

       

  •   sed    '/UUID/ixniu'    fstab                ##在文件的UUID前面插入xniu

       

  •       sed  -n  '/^#/wxniu' fstab           ##以#开头的行写入文件xniu中,-n不显示fstab的内容

       

       

  •   sed    's/\<bin/hello/g' pass         ##把所有行和列中中以bin开头的修改为/hello
  •   sed 's@\/@%%@g' pass           ##此时的@与/功能类似
  •   sed '=' pass | sed 'N;s/\n/ /g'       ##修改\n为空;意思去掉空格。N表示可以时\n生效;=添加行号

       

  •   sed -f rule pass                         ##在rule文件中写入要执行的变化

        

  •    sed -n '/^#/=' fstab              ##只显示行号,无内容    
  •    sed  '/^#/=' fstab                 ## 显示#开头的行号和对应内容
  •    sed  '$r user' fstab              ##把文件user中的内容加入fstab的最后一行
  •    sed '1r user' fstab               ##把user中的内容加入第一行
  •    sed '/UUID/r user' fstab      ##加在UUID所在行的下一行
  •    sed   '/hello/cniu'  -i aa       ##-i修改时,同时修改文件中的内容   

 

  •    sed    'G'  pass                       ##使文件data中的每行都隔开一行显示

 

  •     sed  '$!G'  pass                  ##文件的最后一行没有间隔
  •     sed  -n '$p' pass                     ##显示最后一行的内容
  •    sed '/root/,/mail/s/nologin/##/g;s/sbin/westos/g' pass        ##查看固定区域内的且修改sbin为westos

3)awk报告生成器

   1、awk基本介绍

         awk处理机制:awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行做一些总结性质的工作。在命令格式上分别体现如下:

            BEGIN{}:读入第一行文本之前执行,一般用来做初始化操作

          {}:逐行处理,逐行读入文本并执行响相应的处理。

           END{}:处理完最后一行文本之后执行,一般用来输出处理结果

    2、基本用法

            awk  '{print  filename}'   passwd

          awk   '{print  “NR”行,"NF"列}'

          awk   'BEGIN{print  NAME}'

          awk    'END{print  xniu}'

          awk  -F : 'BEGIN{print  name}{print $1}END{XNIU}'

          awk     '/bash$/'

          awk   -F :  '/bash$/{print  $1}'

   3、示例

  •    awk -F : '{print $1}' pass                      ##分割符为:,输出第一列的内容      

 

          

 

  •     awk -F : '{print $1","$2}' pass           ##在输出第一列和第二列时,添加符号时用“”

 

          

 

  •    awk -F : 'BEGIN{print "name"}{print $1}END{print "end"}' pass                  ##在输出第一列的时候,刚开始输出name,结束后输出end
  •  awk -F : 'END{print  NR","NF}' pass                             ##输出pass文件的行和列

         

  •    awk 'BEGIN{N=0}{N++}END{print N}' pass              ##使用算法的自增计算行数  
  •    awk  -F : '/bash$/{print $1}' /etc/passwd                        ##以:分隔符,输出以bash结尾的第一列

                    

  •    awk  -F : '/bash$/||/sh$/{print $1}' /etc/passwd           ##使用||符号可以设置两个并列条件
  •    cat -n pass | awk 'NR>=4&&NR<=6{print}'             ##显示第四行到第6行的内容

          

  •    awk -F : '/^ro/{print}' /etc/passwd                                  ##显示以ro开头行的内容
  •    awk -F : '/^[a-d]/{print $1","$6}' /etc/passwd             ##显示以a-d任意字符开头第一列和第六列
  •   awk -F : '/^a|nologin$/{print $1$7}' pass                        ##显示以a开头或以nologin结尾的行内容的第一和七列
  •    awk -F : '$6~/bin$/{print $1" "$6}'      pass               ## 若第6列以bin结尾,则输出该行的第一列和第6列    

 

 

  •    awk -F : '$6!~/bin$/{print $1" "$6}' pass                   ##输出第六列不以bin结尾的行的第1、6列    

例题一:    显示本机的IP

   ifconfig eth0 | awk '/\<inet/{print $2}'   或者 ifconfig eth0|sed -n 2p | awk -F " " '{print $2}'   awk -F = '/^IPADDR0/{print $2}' /etc/sysconfig/network-scripts/ifcfg-eth0 

          

例题二:查找以可以登陆系统的用户(bash类型),并且用户在home目录下

  awk -F : '/bash$/&&$6~/^\/home/{print $1}' /etc/passwd   

           

例题三:使用一条命令执行,找出/usr/share/mime/packages/freedesktop.org.xml文件中含有ICH的行,并去掉空格后存入/root/lines文件中。

   sed 's/^ *//g;/ich/w/root.lines' /usr/share/mime/packages/freedesktop.org.xml         

例题四:输出不含数字或特殊字符的test
   awk  '!/^[[:digit:][:punct:]]/{print}'    test   

        

 

 

posted @ 2018-08-21 00:40  UTHN_B  阅读(668)  评论(0编辑  收藏  举报