当要查看文本中特定字符的时候,我们会经常用到GREP、SED、AWK,今天我们一起来学习下LINUX中的文本过滤工具GREP和SED的基本使用

 

 
  
  1.  
  2.  
  3.  
  4. 正则表达式:  
  5.     定义:  
  6.         是一些字符或是特殊字符串模式的集合。  
  7.     功能:根据模式搜索文本,并将符合模式的文本行显示出来。  
  8.     Pattern(模式):   
  9.         文本字符和正则表达式的元字符组合而成匹配条件  
  10. grep:  
  11.  
  12.  
  13. grep简介  
  14. grep(global search regular RE) < /span>and print out the line,全面搜索正则表达式并把行打印出来  
  15.     是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。  
  16.     Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。  
  17. egrep是grep的扩展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符  
  18. 表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。  
  19.  
  20.     grep是很常见也很常用的命令,它最重要的功能就是进行字符串数据的比较,然后将符合用户要求的字符串显示出来。  
  21. 在这里需要说明的是,grep在数据中查找一个字符串时,是以”整行“为单位来进行数据选取的。也就是说,假如一个文件内有10行,其中有两行具有  
  22. 所搜索的字符串,则将那两行显示在屏幕上,其它则丢去。  
  23.     注:默认情况下正则表达式工作在贪婪模式下  
  24. grep [options] PATTERN [FILE...]  
  25.     -a:在二进制文件夹中,以文本文件的方式搜索数据。  
  26.     -i:忽略大小写  
  27.     --color:将匹配的字符串以颜色基于现实  
  28.     -v:反向查询,即显示出没有被‘搜索字符串’内容的哪一行  
  29.     -o:只显示被模式匹配的字符串  
  30.         grep -o 'root' /etc/passwd  
  31.         root  
  32.         ....  
  33.     -n:输出行号  
  34.     -c:计算找到‘搜索字符串’的次数  
  35.     -A:# 匹配结果并将匹配结果的后#行一并显示  
  36.     -B: # 匹配结果并将匹配结果的前#行一并显示  
  37.     -C:A and b  显示匹配结果前和后各几行。  
  38. 正则表达式就是里面有一些元字符,这些字符不表示它本身的意思,而表示通配的意义。  
  39.  
  40. 介绍grep进行文件搜索时所用到的云字符并加以介绍  
  41.  
  42.     搜索特定字符串、利用[]来搜索集合字符、任意一个字符(.)与重复字符(*)、  
  43.     行首与行尾字符^$、限定连接重复字符范围{}、位置锚定、组  
  44.       
  45. 下面我们就来一起学习元字符的含义:  
  46. ^ : 锚定行首  
  47.     例如:  
  48.         '^root':表示以root作为行首进行查找  
  49. $ : 锚定行尾  
  50.     例如:  
  51.         'nologin$':表示查找以nologin结尾所匹配的行  
  52. . : 匹配任意单个字符  
  53.     例如:  
  54.         'r..t':表示查找以r开头,t结尾并且中间存在两个字符匹配的行  
  55. * : 一个单字符后紧跟*,匹配0个或多个此单字符  
  56.     例如:  
  57.         'ok*':表示以o为开头后面可以没有k个字符,也可以出现多次  
  58. .*: 任意字符  
  59.     例如:  
  60.         'root.*':表示查找以root开头后面跟任意字符所匹配的行  
  61. []:匹配[]内字符序列范围  
  62.     例如:  
  63.         '[a-z]'表示匹配[]任意一个小写字母  
  64. [^]:匹配[]内以外的字符串  
  65.     例如:  
  66.         '[^root]':表示除root以外的行  
  67. ^$:显示空白行  
  68.     例如:  
  69.         '^$':表示以空白行作为模式并显示匹配的行  
  70. \<: 其后面的任意string必须作为单词首部出现  
  71.     例如:  
  72.         '\<root':表示查找以root作为模式而且必须出现在行首  
  73. \>: 其前面的任意string必须作为单词尾部出现   
  74.     例如:  
  75.         'nologin\>':表示查找以root作为模式而且必须出现在行尾  
  76. \<sting\>: 以string为整体并进行对文本文件进行查找  
  77.     例如:  
  78.         '\<root\>':表示以root为单词并进行搜索  
  79. \(\):分组  
  80.     例如:  
  81.         \(ab\)*:把ab当作整体,ab可以出现0次,1次,或多次  
  82. \(\)\1:引用第一个左括号以及与之对应的右括号所包括的所有内容  
  83.     \2:  
  84.     \3:  
  85.     例如:  
  86.         \(ab\)\1:表示以ab为以个整体显示,并引用前面ab字符串显示出来  
  87.  
  88. \ :用来注释一个元字符的特殊含义。因为有在shell中一些元字符有特殊含义。  
  89.     例如:  
  90.         '\/'表示查找以'/'作为模式进行查找  
  91. pattern\{m\}:用来匹配前面pattern出现n次  
  92.     例如:  
  93.         'root\{2\}:表示匹配root字符串而且必须出现2次  
  94. pattern\{m, \}:用来匹配前面pattern至少m次,多则不限  
  95.     例如:'root\{1, \}:表示至少出现1次root,多则不限  
  96. pattern\{m,n\}:用来匹配前面pattern至少m次,至多n次  
  97.     例如:  
  98.         'root\{1, 2\}:表示至少出现1次root,至多2次  
  99.           
  100.           
  101. EGREP:        
  102. egrep和grep -E的元字符扩展集  
  103. +:匹配一个或多个先前的字符。如:'[a-z]+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。  
  104. ?:匹配零个或多个先前的字符。如:'gr?p'匹配gr后跟一个或没有字符,然后是p的行。  
  105. a|b|c:匹配a或b或c。如:grep|sed匹配grep或sed  
  106. ():分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。  
  107. x{m},x{m,},x{m,n}:作用同x\{m\},x\{m,\},x\{m,n\}  
  108.  
  109. POSIX字符类:  
  110.  
  111. [[:space:]]:所有空格字符  
  112.     [[:punct:]]:标点符号  
  113.     [[:lower:]]:小写字母  
  114.     [[:upper:]]:大写字母  
  115.     [[:digit:]]:数字  
  116.     [[:alnum:]]:数字和大小写字母  
  117.  
  118.  
  119. sed基本用法:  
  120.  
  121. sed(Stream EDitor):它是一种流编辑器  
  122. sed:文本编辑器,而不是字处理器,只是操作纯ASCII码文本的,其次它在操作文本的时候,是按行进行的,逐行进行。  
  123.     sed的主要功能是实现逐行处理文本的,所以我们称它为行编辑器。  
  124.       
  125. sed的处理机制:  
  126.     每当处理一个文本文件时,它不会直接编辑文本文件的本身,而是将文本文件的内容逐行读取到内存空间里,而后在内存空间里完成编辑工作,随后将编辑出的结  
  127.     果以标准输出显示到屏幕上。  
  128.     我们称这个内存空间成为模式空间。  
  129.       
  130. sed: 模式空间  
  131.     默认不编辑原文本文件本身,仅对模式空间中的数据做处理;而后将处理结束后,将模式空间打印至屏幕。  
  132.  
  133.  
  134. sed [options] 'AddressCommand' file ...  
  135.     -n: 静默模式,不再默认显示模式空间中的内容,只显示符合条件的行。  
  136.     -i: 直接修改原文件  
  137.     -e SCRIPT -e SCRIPT:可以同时执行多个脚本  
  138.     -f /PATH/TO/SED_SCRIPT  
  139.         sed -f /path/to/scripts  file  
  140.     -r: 表示使用扩展正则表达式  
  141.       
  142. Address:  
  143. 1、StartLine,EndLine  
  144.     比如1,10,表示第一行到第10行  
  145.     $:表示最后一行  
  146.     $-1:表示倒数第二行  
  147. 2、/RegExp/:支持正则表达式  
  148.     /^root/  
  149. 3、/pattern1/,/pattern2/  
  150.     第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行  
  151. 4、LineNumber  
  152.     指定的行  
  153. 5、StartLine, +N  
  154.     从startLine开始,向后的N行;  
  155.      '1.+2':  
  156. Command:  
  157.     d: 删除符合条件的行;  
  158.         For example:删除/etc/inittab文件中1到10行的内容  
  159.             # sed '1,10d' /etc/inittab  
  160.         For example:删除/etc/passwd文件中包括hdoop的行  
  161.             # sed '/hdoop/d'/etc/passwd  
  162.     p: 显示符合条件的行;  
  163.         For example:显示/etc/passwd文件中以hdoop开头的行  
  164.             # sed '/^hdoop/p' /etc/passwd   
  165.     a \string: 在指定的行后面追加新行,内容为string  
  166.         For example:显示/etc/passwd文件中以hdoop开头的行后面追加“I am hdoop”  
  167.             # sed '/^hdoop/a \I am hdoop /etc/passwd  
  168.         如果想加两行的话,我可以使用换行符 \n:可以用于换行  
  169.     i \string: 在指定的行前面添加新行,内容为string  
  170.         For example:显示/etc/passwd文件中以hdoop开头的行前面追加“I am hdoop”  
  171.             # sed '/^hdoop/i \I am hdoop' /etc/passwd  
  172.     r FILE: 将指定的文件的内容添加至符合条件的行处  
  173.         For example:在/etc/passwd文件中第二行后面追加/etc/inittab文件中的内容  
  174.             # sed '2r /etc/inittab /etc/passwd 即可:  
  175.             如果是在指定第一行和第二行后面添加指定文件内容的行  
  176.             # sed '1,2r /etc/inittab /etc/passwd  
  177.     w FILE: 将地址指定的范围内的行另存至指定的文件中;   
  178.         For example:在/etc/passwd文件中以hdoop开头的行保存至/tmp/hdoop.bak  
  179.             # sed '/^hdoop/w /tmp/hdoop.bak' /etc/passwd  
  180.     s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串  
  181.         For example:查找/etc/passwd文件中hdoop字符换成大写的hoop  
  182.             # sed 's/hdoop/HDOOP/' /etc/passwd  
  183.         修饰符  
  184.             g: 全局替换  
  185.             i: 查找时忽略字符大小写     
  186.  
  187.     \(\), \1, \2  
  188.     For example:将下面的like修改为liker,love修改为lover  
  189.         l..e: like-->liker  
  190.         love-->lover  
  191.           
  192.         # sed 's#\(l..k\)#\1r#g' /tmp/text  
  193.         # sed 's#l..k#&r#g' /tmp/text  
  194.     &: 引用模式匹配整个串      
  195.       
  196.     For example:将下面的小写l换成大小l  
  197.         like-->Like  
  198.         love-->Love   
  199.         # sed 's#l\(..e\)#L\1#g' sed.text   
  200.     grep和sed命令的使用,就先告一段落,以上内容会陆续进行添减,敬请关注: