正則表達式(grep)元字符及模式匹配的介紹及sed高級應用選項

當要查看文本中特定字符的時候,我們會經常用到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命令的使用,就先告一段落,以上內容會陸續進行添減,敬請關注: 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章