Unix中的grep命令

9 篇文章 0 订阅

       grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印出来,不会修改原文件内容。

使用grep 命令的语法为:

 $grep [option(s)] pattern [file(s)]

    

    其中option为grep命令的选项,pattern为要匹配的简单字符串或携带特殊字符的模式字符串,file为文件列表,可有多个文件。

 

Part 1  grep中经常用到的选项(option)

-i 忽略pattern中的大小写

 $grep -i hAL /etc/passwd

-w 搜索整个词汇

    忽略大小写并搜索整个词汇"samba"

  $grep -iw "samba" /tec/samba/smb.conf   

  # This is the main Samba configuration file. You should read the    

  # here. Samba has a huge number of configurable options (perhaps too    

  # For a step to step guide on installing, configuring and using samba,    

  # read the Samba-HOWTO-Collection. This may be obtained from:

 

-r 递归地指定文件所在目录中的所有子目录中的文件

-v 查找与pattern不匹配的行

定义输出方式:

-o 仅打印出匹配的一段,而非整行

-n 打印出匹配行的行号

-l 仅打印出匹配行所在的文件

-c 打印出每个文件中匹配行的总数

-A num 显示匹配行之后的num行 

-B num 显示匹配行之前的num行

-C num 相当于 -A num 与 -B num 的组合

--color=auto 将pattern在匹配行中高亮输出

 

注意:

(1).选项区分大小写

(2).多个选项可以一起使用,例如:

  $grep -iwr

(3).grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

 

Part 2 在grep中使用正则表达式

 

1.基本的匹配模式

    尽管直接使用最简单直接的pattern字串可以完成一些重要任务,但是grep命令的真正威力在于它可以使用正则表达式来完成复杂的模式字串的匹配。grep命令中使用的是“基本的正则表达式”,如果想使用更高级的正则表达式规则,需要指定选项 -E ,相当于egrep命令。

    以下字符或字符串在正则表达式的规则中具有特殊意义,如,*,+,[,],^,$,\,{,}

    它们的多种组合展示了基本的正则表达式的匹配模式:

    (1)'.'匹配任意单一字符

    (2) X* 与包含连续0个或多个字符X的行匹配 

    (3) X\+ 与包含连续1个或多个字符X的行匹配 

    (4) [a-z] 与包含a-z的其中一个字符的行匹配

    (5) [^a-z] 与不包含a-z的其中一个字符的行匹配

    (6) [0-9] 与包含0-9的其中一个字符的行匹配

    (7) ^hello 与以字串hello起始的行匹配

    (8) hello$ 与以字串hello结束的行匹配

    (9) \ 转义字符,后跟特殊字符,可表示它本来的涵义

    (10)

             \d 匹配一个数字字符. 等价于 [0-9]

             \D 匹配一个非数字符. 等价于 [^0-9]

             \w  ,等价于 "[A-Za-z0-9_]"

             \W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"

              \s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]

             \S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v]

              \b 匹配一个单词边界,也就是指单词和空格间的位置。

              \B 匹配非单词边界。

    如,

  $grep '[' filename

 

    返回结果为grep :  Invalid regular expression

    而  ,

  $grep '\[' filename

 会匹配所有包含'['(不包括单引号)的行。

    X\{n\} 与连续包含n个字符X的行匹配

    (11) X\ {n,\} 与至少连续包含n个字符X的行匹配 (注意n后面的',')

    (12) X \{,m\} 与最多连续包含m个字符X的行匹配 (注意m前面的',')

    (13) X \{n,m\} 与最少包含n个,最多包含m个字符X的行匹配

注意:

     1.不要混淆shell 中的".","*"与正则表达式中的".","*",很多刚开始学的人都会犯错。

    在正则表达式中,"."很像shell中的"?",它与任意单一字符匹配。而"*"在正则表达式中的使用,表示"*"前面的字符可能出现0次或1次或多次,与shell中的"*"涵义不同。

2.grep 中模式(pattern)之间的OR,AND,NOT 操作

1.grep or 操作(4 种方法)

1.1 使用 \|

  $grep 'pattern1\|pattern2' filename   

1.2.使用 -E 选项

    grep -E 代表扩展的正则表达式. 若使用-E选项,则可以去掉转义字符'\',直接使用'|'

  $grep -E 'pattern1|pattern2' filename  

1.3.使用 egrep 命令

    egrep 相当于 ‘grep -E’. 

1.4.使用 -e 选项

    通过指定多个-e选项来应用多个pattern,多个pattern之间是“或”的关系

 $grep -e pattern1 -e pattern2 filename

 

2.grep AND 操作

2.1 使用 -E选项和模式字符 'pattern1.*pattern2'

 $grep -E 'pattern1.*pattern2' filename  

    以上命令为在filename文件中查找既与pattern1匹配又与pattern2匹配的行

 $grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename 

  

2.2 利用管道实现

 $grep -E 'pattern1' filename | grep -E 'pattern2'   

3.Grep NOT 操作

3.1使用  -v 选项

 $grep -v 'pattern' filename  

    以上命令在filename文件中查找不能与pattern匹配的行

 

Part 3 grep命令的 Examples

1. 对文件中的空行计数

  $grep -c "^$" filename  

2.查找在“hello”有任意长度字串的行

  $grep  ".*hello" filename    

3.查找在'hi'与'hello'之间至少有一个空格的行

  $grep "hi \+hello" filename

4.查找在'hi'与'hello'之间没有空格或有多个空格的行

  $grep "hi *hello" filename 

5..查找在'hi'与'hello'之间没有空格或有1个空格的行

  $grep "hi \?hello" filename 

6.查找ip地址127.0.0.1 (其中包含特殊字符 '.')

  $grep "127\.0\.0\.1"  filename

7.过滤其他命令的输出结果

  $ls --help | grep "dired"

    将ls命令的帮助文本,作为grep的输入,查找与"dired"匹配的行

    输出为:-D, --dired      generate output designed for Emacs' dired mode

8.从系统日志中获得有用的信息

    在apache日志文件中查找以IP地址开头,包含数字200的行

  $grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200" /srv/www/example.com/logs/access.log

 

Part 3 grep命令的 man

◎grep -- print lines matching a pattern (将符合样式的该行列出) 

 ◎语法: grep [options]  
 PATTERN [FILE...]  
 grep用以在file内文中比对相对应的部分,或是当没有指定档案时,  
 由标准输入中去比对。 在预设的情况下,grep会将符合样式的那一行列出。 

         此外,还有两个程式是grep的变化型,egrep及fgrep。           
         其中egrep就等同於grep -E ,fgrep等同於grep -F 。 

 ◎参数 
    1. -A NUM,--after-context=NUM  
               除了列出符合行之外,并且列出後NUM行。 
              
         ex:   $ grep -A 1 panda file  
               (从file中搜寻有panda样式的行,并显示该行的後1行) 
                                  
    2. -a或--text   
               grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标, 
               则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。 
                   
               若加上-a参数则可将二进位档案视为文字档案搜寻, 
               相当於--binary-files=text这个参数。 
             
         ex:   (从二进位档案mv中去搜寻panda样式) 
               (错误!!!) 
               $ grep panda mv  
               Binary file mv matches   
               (这表示此档案有match之处,详见--binary-files=TYPE ) 
               $ 
               (正确!!!) 
               $ grep -a panda mv  
        
    3. -B NUM,--before-context=NUM 
               与 -A NUM 相对,但这此参数是显示除符合行之外 
               并显示在它之前的NUM行。         
              
         ex:   (从file中搜寻有panda样式的行,并显示该行的前1行) 
               $ grep -B 1 panda file  

    4. -C [NUM], -NUM, --context[=NUM]   
               列出符合行之外并列出上下各NUM行,预设值是2。 
              
         ex:   (列出file中除包含panda样式的行外并列出其上下2行) 
               (若要改变预设值,直接改变NUM即可) 
               $ grep -C[NUM]  panda file  
              
    5. -b, --byte-offset 
               列出样式之前的内文总共有多少byte .. 
               
          ex:  $ grep -b  panda file   
       显示结果类似於: 
         0:panda 
        66:pandahuang 
       123:panda03 
            
    6. --binary-files=TYPE 
               此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果: 
                 1.若有符合的地方:显示Binary file 二进位档名 matches 
                 2.若没有符合的地方:什麽都没有显示。 
                    
               若TYPE为without-match,遇到此参数, 
               grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。 
                    
               若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。 
         
     Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。 
               
    7. -c, --count 
       不显示符合样式行,只显示符合的总行数。 
       若再加上-v,--invert-match,参数显示不符合的总行数。 

    8. -d ACTION, --directories=ACTION 
               若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。 
       预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案; 
       若ACTION是skip(略过),资料夹会被grep略过: 
       若ACTION是recurse(递),grep会去读取资料夹下所有的档案, 
       此相当於-r 参数。 

    9.  -E, --extended-regexp 
       采用规则表示式去解释样式。 
       
   10.  -e PATTERN, --regexp=PATTERN 
       把样式做为一个partern,通常用在避免partern用-开始。   

   11.  -f FILE, --file=FILE 
       事先将要搜寻的样式写入到一个档案,一行一个样式。 
       然後采用档案搜寻。 
       空的档案表示没有要搜寻的样式,因此也就不会有任何符合。 
        
   ex: (newfile为搜寻样式档) 
       $grep -f newfile file     

   12.  -G, --basic-regexp 
       将样式视为基本的规则表示式解释。(此为预设) 

   13.  -H, --with-filename 
       在每个符合样式行前加上符合的档案名称,若有路径会显示路径。 
        
   ex: (在file与testfile中搜寻panda样式)    
       $grep -H panda file ./testfile 
                file:panda 
                ./testfile:panda 
                $ 
      
   14.  -h, --no-filename   
               与-H参数相类似,但在输出时不显示路径。 

   15.  --help  
               产生简短的help讯息。 

   16.  -I 
               grep会强制认为此二进位档案没有包含任何搜寻样式, 
               与--binary-files=without-match参数相同。 
                    
           ex:  $ grep -I  panda mv 

   17.  -i, --ignore-case        
               忽略大小写,包含要搜寻的样式及被搜寻的档案。 
                
           ex:  $ grep -i panda mv 
                 
   18.  -L, --files-without-match  
               不显示平常一般的输出结果,反而显示出没有符合的档案名称。 

   19.  -l, --files-with-matches                
               不显示平常一般的输出结果,只显示符合的档案名称。 

   20.  --mmap                
               如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。  
               在某些状况,--mmap 能产生较好的效能。 然而,--mmap  
               如果运作中档案缩短,或I/O 错误发生时, 
               可能造成未定义的行为(包含core dump),。 
                
   21.  -n, --line-number 
               在显示行前,标上行号。 
                
            ex:  $ grep -n  panda file   
                显示结果相似於下: 
                行号:符合行的内容 

   22.  -q, --quiet, --silent  
               不显示任何的一般输出。请参阅-s或--no-messages 

   23.  -r, --recursive 
       递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。 

   24.  -s, --no-messages 
       不显示关於不存在或无法读取的错误讯息。 
      
 小: 不像GNU grep,传统的grep不符合POSIX.2协定, 
       因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。 
       Shell Script倾向将传统的grep移植,避开-q及-s参数, 
       且将输出限制到/dev/null。 
     
POSIX: 定义UNIX及UNIX-like系统需要提供的功能。               
     
   25.  -V, --version
  显示出grep的版本号到标准错误。 
  当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。 

   26.  -v, --invert-match 
  显示除搜寻样式行之外的全部。 
                    
   27.  -w, --word-regexp 
          将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。 

   28.  -x, --line-regexp 
  将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值