`
jayghost
  • 浏览: 429308 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Unix中的grep命令

阅读更多

       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 
  将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。

分享到:
评论

相关推荐

    unix的grep命令

    unix下学习grep命令不可多得的资料,决定原创,绝对值的你拥有!!

    Linux Grep命令使用的详细介绍

    Unix的grep家族包 括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中...

    grep命令介绍.docx

    grep命令介绍.docx Unix/Linux

    UNIX常用命令大全

    可以直接打印 共11页 第一章 目录及文件操作命令 2 1.1 ls 2 1.2 pwd 2 1.3 cd 2 1.4 mkdir 2 1.5 rmdir 2 1.6 cat 2 1.7 head 2 1.8 more 2 ...1.25 grep 5 ...第七章 数学计算命令 9 ...UNIX的Shell命令详解 10

    详细unix命令大全

    查看UNIX内存和SWAP的命令 AIX: /usr/sbin/lsattr -El sys0 -a realmem /usr/sbin/lsps -s HP-UX: grep Physical /var/adm/syslog/syslog.log /usr/sbin/swapinfo -t LINUX: cat /proc/meminfo|grep MemTotal ...

    UNIX基本命令学习指导

    1.4.18 grep 命令 14 1.4.19 vi 命令 15 1.5 ftp命令 15 第2章 常用系统管理命令 19 2.1 用户管理 19 2.1.1 who 显示系统中的用户 19 2.1.2 whodo 显示系统中用户及进程 19 2.1.3 passwd 修改密码 19 2.1.4 logname ...

    Unix相关命令chmod cat more grep ftp

    切换到编辑状态(插入状态) 编辑状态: 在编辑状态任何输入都是对内容的编辑 i (insert) 插入 在光标的之前位置插入 o (open) 打开 在当前行以后插入 a (append) 追加 在光标以后追加.

    unix常用命令

    unix常用命令cd命令 这它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是...grep命令常用于分析一行的信息,find命令find是一个基于查找的功能非常强大的命令,cp该命令用于复制文件等

    UNIX目录及文件操作命令

    此文档包含UNIX基本命令 第一章 目录及文件操作命令 ls、pwd、cd、grep等 第二章 设备管理 stty、lp等 第三章 进程管理 sleep、ps、kill等 第四章 系统管理和用户管理 who、 whodo、passwd等 第五章 通信和...

    linux匹配命令awk、grep、sed简介

    awk本身就是UNIX/Linux的一种编程语言,用于处理数据和生成报告。 awk逐行方式扫描文件(或输入),...Linux使用的GNU grep,基本包含了上述三个grep命令 sed全称stream editor(流编辑器),是非交互式编辑器,能执行

    Linux常用命令之grep命令用法详解

    grep是linux的常用命令,用于对文件和文本执行重复搜索任务的Unix工具,可以通过grep命令指定特定搜索条件来搜索文件及其内容以获取有用的信息。 Usage: grep [OPTION]... PATTERN [FILE]... Search for PATTERN in...

    正则表达式grep[global search regular expression]

    Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的...

    unix ed编辑器命令详解

    首先要学习的就是文本编辑,而 ed 编辑器是 unix/linux 操作系统下最简单、最典型的文本编辑器,因此,学习 ed 编辑器能够帮助你很好的理解一般的文本操作,而且还可以为你以后学习 unix/linux下的一些常用命令(如 ...

    UNIX常用命令-目录及文件操作命令

    UNIX常用命令-目录及文件操作命令总结,包括ls、pwd、grep、mv、find、file、grep、split等

    UNIX命令及SHELL编程

    这是一套完整的Unix培训教材,包括Unix常用命令及SHELL编程基础与高级技巧,PDF格式,共30个文件。另有2个Word文档。包内文件清单如下: 01_Shell-文件安全与权限.PDF 02_Shell-使用find和xargs.PDF 03_Shell-...

    unix操作系统培训教材.doc

    4.3 grep命令基本用法 13 4.4 利用cmp命令比较文件 13 第5章 UNX系统深入了解 15 5.1 与UNIX有关的几个名词 15 5.2 在后台运行程序 15 5.3 在指定时间执行指定程序 15 5.4 如何控制后台进程 16 5.5 如何查看磁盘使用...

    UNIX常用命令.txt

    常用命令: tail -f echannel_business.log topas jobs -l more echannel_business.log.2011-10-24-12 set -o vi ps -ef | grep 254162 ls -ltr

    shell编程和unix命令

    8.4 系统grep命令 62 8.4.1 目录 63 8.4.2 passwd文件 63 8.4.3 使用ps命令 63 8.4.4 对一个字符串使用grep 64 8.5 egrep 64 8.6 小结 65 第9章 AWK介绍 66 9.1 调用awk 66 9.2 awk脚本 67 9.2.1 模式和动作 67 ...

    unix命令集

    很好的UNIX学习帮助资料!

Global site tag (gtag.js) - Google Analytics