當要查看文本中特定字符的時候,我們會經常用到GREP、SED、AWK,今天我們一起來學習下LINUX中的文本過濾工具GREP和SED的基本使用:
- 正則表達式:
- 定義:
- 是一些字符或是特殊字符串模式的集合。
- 功能:根據模式搜索文本,並將符合模式的文本行顯示出來。
- Pattern(模式):
- 文本字符和正則表達式的元字符組合而成匹配條件
- grep:
- grep簡介
- grep(global search regular RE) < /span>and print out the line,全面搜索正則表達式並把行打印出來
- 是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
- Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。
- egrep是grep的擴展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符
- 表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
- grep是很常見也很常用的命令,它最重要的功能就是進行字符串數據的比較,然後將符合用戶要求的字符串顯示出來。
- 在這裏需要說明的是,grep在數據中查找一個字符串時,是以”整行“爲單位來進行數據選取的。也就是說,假如一個文件內有10行,其中有兩行具有
- 所搜索的字符串,則將那兩行顯示在屏幕上,其它則丟去。
- 注:默認情況下正則表達式工作在貪婪模式下
- grep [options] PATTERN [FILE...]
- -a:在二進制文件夾中,以文本文件的方式搜索數據。
- -i:忽略大小寫
- --color:將匹配的字符串以顏色基於現實
- -v:反向查詢,即顯示出沒有被‘搜索字符串’內容的哪一行
- -o:只顯示被模式匹配的字符串
- grep -o 'root' /etc/passwd
- root
- ....
- -n:輸出行號
- -c:計算找到‘搜索字符串’的次數
- -A:# 匹配結果並將匹配結果的後#行一併顯示
- -B: # 匹配結果並將匹配結果的前#行一併顯示
- -C:A and b 顯示匹配結果前和後各幾行。
- 正則表達式就是裏面有一些元字符,這些字符不表示它本身的意思,而表示通配的意義。
- 介紹grep進行文件搜索時所用到的雲字符並加以介紹
- 搜索特定字符串、利用[]來搜索集合字符、任意一個字符(.)與重複字符(*)、
- 行首與行尾字符^$、限定連接重複字符範圍{}、位置錨定、組
- 下面我們就來一起學習元字符的含義:
- ^ : 錨定行首
- 例如:
- '^root':表示以root作爲行首進行查找
- $ : 錨定行尾
- 例如:
- 'nologin$':表示查找以nologin結尾所匹配的行
- . : 匹配任意單個字符
- 例如:
- 'r..t':表示查找以r開頭,t結尾並且中間存在兩個字符匹配的行
- * : 一個單字符後緊跟*,匹配0個或多個此單字符
- 例如:
- 'ok*':表示以o爲開頭後面可以沒有k個字符,也可以出現多次
- .*: 任意字符
- 例如:
- 'root.*':表示查找以root開頭後面跟任意字符所匹配的行
- []:匹配[]內字符序列範圍
- 例如:
- '[a-z]'表示匹配[]任意一個小寫字母
- [^]:匹配[]內以外的字符串
- 例如:
- '[^root]':表示除root以外的行
- ^$:顯示空白行
- 例如:
- '^$':表示以空白行作爲模式並顯示匹配的行
- \<: 其後面的任意string必須作爲單詞首部出現
- 例如:
- '\<root':表示查找以root作爲模式而且必須出現在行首
- \>: 其前面的任意string必須作爲單詞尾部出現
- 例如:
- 'nologin\>':表示查找以root作爲模式而且必須出現在行尾
- \<sting\>: 以string爲整體並進行對文本文件進行查找
- 例如:
- '\<root\>':表示以root爲單詞並進行搜索
- \(\):分組
- 例如:
- \(ab\)*:把ab當作整體,ab可以出現0次,1次,或多次
- \(\)\1:引用第一個左括號以及與之對應的右括號所包括的所有內容
- \2:
- \3:
- 例如:
- \(ab\)\1:表示以ab爲以個整體顯示,並引用前面ab字符串顯示出來
- \ :用來註釋一個元字符的特殊含義。因爲有在shell中一些元字符有特殊含義。
- 例如:
- '\/'表示查找以'/'作爲模式進行查找
- pattern\{m\}:用來匹配前面pattern出現n次
- 例如:
- 'root\{2\}:表示匹配root字符串而且必須出現2次
- pattern\{m, \}:用來匹配前面pattern至少m次,多則不限
- 例如:'root\{1, \}:表示至少出現1次root,多則不限
- pattern\{m,n\}:用來匹配前面pattern至少m次,至多n次
- 例如:
- 'root\{1, 2\}:表示至少出現1次root,至多2次
- EGREP:
- egrep和grep -E的元字符擴展集
- +:匹配一個或多個先前的字符。如:'[a-z]+able',匹配一個或多個小寫字母后跟able的串,如loveable,enable,disable等。
- ?:匹配零個或多個先前的字符。如:'gr?p'匹配gr後跟一個或沒有字符,然後是p的行。
- a|b|c:匹配a或b或c。如:grep|sed匹配grep或sed
- ():分組符號,如:love(able|rs)ov+匹配loveable或lovers,匹配一個或多個ov。
- x{m},x{m,},x{m,n}:作用同x\{m\},x\{m,\},x\{m,n\}
- POSIX字符類:
- [[:space:]]:所有空格字符
- [[:punct:]]:標點符號
- [[:lower:]]:小寫字母
- [[:upper:]]:大寫字母
- [[:digit:]]:數字
- [[:alnum:]]:數字和大小寫字母
- sed基本用法:
- sed(Stream EDitor):它是一種流編輯器
- sed:文本編輯器,而不是字處理器,只是操作純ASCII碼文本的,其次它在操作文本的時候,是按行進行的,逐行進行。
- sed的主要功能是實現逐行處理文本的,所以我們稱它爲行編輯器。
- sed的處理機制:
- 每當處理一個文本文件時,它不會直接編輯文本文件的本身,而是將文本文件的內容逐行讀取到內存空間裏,而後在內存空間裏完成編輯工作,隨後將編輯出的結
- 果以標準輸出顯示到屏幕上。
- 我們稱這個內存空間成爲模式空間。
- sed: 模式空間
- 默認不編輯原文本文件本身,僅對模式空間中的數據做處理;而後將處理結束後,將模式空間打印至屏幕。
- sed [options] 'AddressCommand' file ...
- -n: 靜默模式,不再默認顯示模式空間中的內容,只顯示符合條件的行。
- -i: 直接修改原文件
- -e SCRIPT -e SCRIPT:可以同時執行多個腳本
- -f /PATH/TO/SED_SCRIPT
- sed -f /path/to/scripts file
- -r: 表示使用擴展正則表達式
- Address:
- 1、StartLine,EndLine
- 比如1,10,表示第一行到第10行
- $:表示最後一行
- $-1:表示倒數第二行
- 2、/RegExp/:支持正則表達式
- /^root/
- 3、/pattern1/,/pattern2/
- 第一次被pattern1匹配到的行開始,至第一次被pattern2匹配到的行結束,這中間的所有行
- 4、LineNumber
- 指定的行
- 5、StartLine, +N
- 從startLine開始,向後的N行;
- '1.+2':
- Command:
- d: 刪除符合條件的行;
- For example:刪除/etc/inittab文件中1到10行的內容
- # sed '1,10d' /etc/inittab
- For example:刪除/etc/passwd文件中包括hdoop的行
- # sed '/hdoop/d'/etc/passwd
- p: 顯示符合條件的行;
- For example:顯示/etc/passwd文件中以hdoop開頭的行
- # sed '/^hdoop/p' /etc/passwd
- a \string: 在指定的行後面追加新行,內容爲string
- For example:顯示/etc/passwd文件中以hdoop開頭的行後面追加“I am hdoop”
- # sed '/^hdoop/a \I am hdoop /etc/passwd
- 如果想加兩行的話,我可以使用換行符 \n:可以用於換行
- i \string: 在指定的行前面添加新行,內容爲string
- For example:顯示/etc/passwd文件中以hdoop開頭的行前面追加“I am hdoop”
- # sed '/^hdoop/i \I am hdoop' /etc/passwd
- r FILE: 將指定的文件的內容添加至符合條件的行處
- For example:在/etc/passwd文件中第二行後面追加/etc/inittab文件中的內容
- # sed '2r /etc/inittab /etc/passwd 即可:
- 如果是在指定第一行和第二行後面添加指定文件內容的行
- # sed '1,2r /etc/inittab /etc/passwd
- w FILE: 將地址指定的範圍內的行另存至指定的文件中;
- For example:在/etc/passwd文件中以hdoop開頭的行保存至/tmp/hdoop.bak
- # sed '/^hdoop/w /tmp/hdoop.bak' /etc/passwd
- s/pattern/string/修飾符: 查找並替換,默認只替換每行中第一次被模式匹配到的字符串
- For example:查找/etc/passwd文件中hdoop字符換成大寫的hoop
- # sed 's/hdoop/HDOOP/' /etc/passwd
- 修飾符
- g: 全局替換
- i: 查找時忽略字符大小寫
- \(\), \1, \2
- For example:將下面的like修改爲liker,love修改爲lover
- l..e: like-->liker
- love-->lover
- # sed 's#\(l..k\)#\1r#g' /tmp/text
- # sed 's#l..k#&r#g' /tmp/text
- &: 引用模式匹配整個串
- For example:將下面的小寫l換成大小l
- like-->Like
- love-->Love
- # sed 's#l\(..e\)#L\1#g' sed.text
- grep和sed命令的使用,就先告一段落,以上內容會陸續進行添減,敬請關注: