grep -io "http:/=[A-Z0-9]\{16\}" ./wsxf.txt >wsxf_urls.txt
首先要記住的是: 正則表達式與通配符不同,它們表示的含義並不相同!
正則表達式只是一種表示法,只要工具支持這種表示法, 那麼該工具就能夠處理正則表達式的字符串。vim、grep、awk 、sed 都支持正則表達式,也正是由於因爲它們支持正則,才顯得它們強大;
1基礎正則表達式
grep 工具,之前介紹過。
grep -[acinv] '搜索內容串' filename
-a 以文本文件方式搜索
-c 計算找到的符合行的次數
-i 忽略大小寫
-n 順便輸出行號
-v 反向選擇,即顯示不包含匹配文本的全部行php
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-s 不顯示不存在或無匹配文本的錯誤信息。
grep命令加- E參數,這一擴展容許使用擴展模式匹配。
其中搜索串能夠是正則表達式!
---
先用例子說明問題:
如下爲整理的grep 正則表達式的大部分功能,詳細參見man
grep: 要用好grep這個工具,其實就是要寫好正則表達式,因此這裏不對grep的全部功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。
$ ls -l | grep '^a' 經過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
$ grep 'test' d* 顯示全部以d開頭的文件中包含test的行。
$ grep 'test' aa bb cc 顯示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]/{5/}' aa 顯示全部包含每一個字符串至少有5個連續小寫字符的字符串的行。
$ grep 'w/(es/)t.*/1' aa 若是west被匹配,則es就被存儲到內存中,並標記爲1,而後搜索任意個字符(.*),這些字符後面緊跟着另一個es(/1),找到就顯示該行。若是用egrep或grep -E,就不用"/"號進行轉義,直接寫成'w(es)t.*/1'就能夠了。
grep正則表達式元字符集(基本集)
^ 錨定行的開始 如:'^grep'匹配全部以grep開頭的行。
$ 錨定行的結束 如:'grep$'匹配全部以grep結尾的行。
. 匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,而後是p。
* 匹配零個或多個先前字符 如:'*grep'匹配全部一個或多個空格後緊跟grep的行。
.*一塊兒用表明任意字符。
[] 匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
/(../) 標記匹配字符,如'/(love/)',love被標記爲1。
/< 錨定單詞的開始,
/> 錨定單詞的結束,如'grep/>'匹配包含以grep結尾的單詞的行。
x/{m/} 重複字符x,m次,如:'o/{5/}'匹配包含5個o的行。 x/{m,/} 重複字符x,至少m次,如:'o/{5,/}'匹配至少有5個o的行。
x/{m,n/} 重複字符x,至少m次,很少於n次,如:'o/{5,10/}'匹配5--10個o的行。
/w 匹配文字和數字字符,也就是[A-Za-z0-9_],如:'G/w*p'匹配以G後跟零個或多個文字或數字字符,而後是p。
/W /w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
/b 單詞鎖定符,如: '/bgrep/b'只匹配grep。
關於匹配的實例:
grep -c "48" test.txt 統計全部以「48」字符開頭的行有多少
grep -i "May" test.txt 不區分大小寫查找「May」全部的行)
grep -n "48" test.txt 顯示行號;顯示匹配字符「48」的行及行號,相同於 nl test.txt |grep 48)
grep -v "48" test.txt 顯示輸出沒有字符「48」全部的行)
grep "471" test.txt 顯示輸出字符「471」所在的行)
grep "48;" test.txt 顯示輸出以字符「48」開頭,並在字符「48」後是一個tab鍵所在的行
grep "48[34]" test.txt 顯示輸出以字符「48」開頭,第三個字符是「3」或是「4」的全部的行)
grep "^[^48]" test.txt 顯示輸出行首不是字符「48」的行)
grep "[Mm]ay" test.txt 設置大小寫查找:顯示輸出第一個字符以「M」或「m」開頭,以字符「ay」結束的行)
grep "K…D" test.txt 顯示輸出第一個字符是「K」,第2、3、四是任意字符,第五個字符是「D」所在的行)
grep "[A-Z][9]D" test.txt 顯示輸出第一個字符的範圍是「A-D」,第二個字符是「9」,第三個字符的是「D」的全部的行
grep "[35]..1998" test.txt 顯示第一個字符是3或5,第二三個字符是任意,以1998結尾的全部行
grep "4/{2,/}" test.txt 模式出現概率查找:顯示輸出字符「4」至少重複出現兩次的全部行
grep "9/{3,/}" test.txt 模式出現概率查找:顯示輸出字符「9」至少重複出現三次的全部行
grep "9/{2,3/}" test.txt 模式出現概率查找:顯示輸出字符「9」重複出現的次數在必定範圍內,重複出現2次或3次全部行
grep -n "^$" test.txt 顯示輸出空行的行號
ls -l |grep "^d" 若是要查詢目錄列表中的目錄 同:ls -d *
ls -l |grep "^d[d]" 在一個目錄中查詢不包含目錄的全部文件
ls -l |grpe "^d…..x..x" 查詢其餘用戶和用戶組成員有可執行權限的目錄集合
更多的例子:
1
搜索有the的行,並輸出行號
$grep -n 'the' regular_express.txt
搜 索沒有the的行,並輸出行號
$grep -nv 'the' regular_express.txt
2 利 用[]搜索集合字符
[] 表示其中的某一個字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
能夠用^符號作[]內的前綴,表示除[]內的字符以外的字 符。
好比搜索oo前沒有g的字符串所在的行. 使用 '[^g]oo' 做搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 內能夠用範圍表示,好比[a-z] 表示小寫字母,[0-9] 表示0~9的數字, [A-Z] 則是大寫字母們。[a-zA-Z0-9]表示全部數字與英文字符。 固然也能夠配合^來排除字符。
搜索包含數字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首與行尾字符 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字符,是位置)那麼‘^$’ 就表示空行,由於只有
行首和行尾。
這裏^與[]裏面使用的^意義不一樣。它表示^後面的串是在行的開頭。
好比搜索the在開頭的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小寫字母開頭的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索開頭不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的結尾,好比 '/.' 表示 . 在一行的結尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '/.$' regular_express.txt //. 是正則表達式的特殊符號,因此要用/轉義
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系統下生成的文本文件,換行會加上一個 ^M 字符。因此最後的字符會是隱藏的^M ,在處理Windows
下面的文本時要特別注意!
能夠用cat dos_file | tr -d '/r' > unix_file 來刪除^M符號。 ^M==/r
那麼'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.css
1.命令功能:html
grep命令用來在文本文件中查找指定模式的詞或短語,並在標準輸出上顯示包括給定字符串模式的全部行;java
egrep命令等同於grep -E,可使用擴展的字符串模式進行搜索;mysql
fgrep命令等同於grep -F,是快速搜索命令,它檢索固定字符串,但不識別正則表達式。linux
2.通常格式:nginx
grep [選項] [查找模式] [文件名1,文件名2,……]git
fgrep [選項] [查找模式] [文件名1,文件名2,……]web
egrep [選項] [查找模式] [文件名1,文件名2,……]正則表達式
3.經常使用選項:
- E 每一個模式做爲一個擴展的正則表達式對待。
- F 每一個模式做爲一組固定字符串對待(以新行分隔),而不做爲正則表達式。
- b在輸出的每一行前顯示包含匹配字符串的行在文件中的字節偏移量。
- c 只顯示匹配行的數量。
- i 比較時不區分大小寫。
- h 在查找多個文件時,指示grep不要將文件名加入到輸出以前。
- l 顯示首次匹配串所在的文件名並用換行符將其隔開。當在某文件中屢次出現匹配串時,不重複顯示此文件名。
- n 在輸出前加上匹配串所在行的行號(文件首行行號爲1)。
- v 只顯示不包含匹配串的行。
- x 只顯示整行嚴格匹配的行。
- e expression 指定檢索使用的模式。用於防止以「-」開頭的模式被解釋爲命令選項。
- f expfile 從expfile文件中獲取要搜索的模式,一個模式佔一行
4.注意如下方面:
在命令後鍵入搜索的模式,再鍵入要搜索的文件。其中,文件名列表中也可使用特殊字符,如「*」等,用來生成文件名列表。若是想在搜索的模式中包含有空格的字符串,能夠用單引號把要搜索的模式括起來,用來代表搜索的模式是由包含空格的字符串組成。不然,Shell將把空格認爲是命令行參數的定界符,而grep命令將把搜索模式中的單詞解釋爲文件名列表中的一部分。在下面的例子中,grep命令在文件example中搜索模式「text file」。
$ grep ’text file’ example
用戶能夠在命令行上用Shell特殊字符來生成將要搜索的文件名列表。在下面的例子中,特殊字符「*」用來生成一個文件名列表,該列表包含當前目錄下全部的文件。該命令將搜索出當前目錄下全部文件中與模式匹配的行。
$ grep data *
特殊字符在搜索一組指定的文件時很是有用。例如,若是想搜索全部的C程序源文件中特定的模式,您能夠用「*.c」來指定文件名列表。假設用戶的 C程序中包含一些沒必要要的轉向語句(goto語句),想要找到這些語句,能夠用以下的命令來搜索並顯示全部包含goto語句的代碼行:
$ grep goto *.c
用戶能夠在命令行上鍵入搜索模式,也可使用-f選項從指定文件中讀取要搜索的模式。在文件中,每一個搜索模式佔一行。若是常常要搜索一組常見字符串時, 這個功能很是有用。在下面的例子中,用戶要在文件exam中搜索字符串「editor」和「create」,就把要搜索的模式放置在文件mypats中, 而後,grep命令從文件mypats中讀取要搜索的模式。
$ cat mypats
editor
create
$ grep -f mypats exam
默認的grep會搜索全部文件,包括隱藏文件夾下的文件。
例如,使用以下命令搜索MediaButton字符串,搜索結果包含隱藏文件夾下的文件。
grep -nr MediaButton *
若是是用svn管理的代碼,每一個文件夾下都有一個.svn的隱藏文件夾,包含對代碼版本的控制信息,日積月累會愈來愈龐大。全部若是隻是默認搜索的話,不少搜索結果都是svn目錄下的,對咱們來講,是沒有價值的內容;並且還會耗費不少時間。
grep的--exclude-dir=參數就是爲了排除某個目錄的,即不包含等號後面的目錄,因此咱們能夠利用此參數去掉.svn的隱藏目錄。
--exclude-dir=參數的用法以下:
1. If you have GNU Grep, it should work like this:
---=".svn" 例如:查找當前目錄以及子目錄下全部包含"MediaButton"字符串的代碼並打印行號
grep -nr --exclude-dir=".svn" MediaButton *
或者
grep -nr --exclude-dir=\.svn MediaButton *
--exclude-dir=後面要排除的目錄用雙引號括起來或者直接接目錄名均可以,可是特殊字符必須用轉義符表示,例如".svn"中的"."。
2.If happen to be on a Unix System without GNU Grep, try the following:
這種方式是使用管道進行雙層「過濾」,其中第二次grep使用了-v選項,即逆向匹配,打印出不匹配的行
-"whatever you like"*|-"\.svn/*" 3. 若是每次都輸入--exclude-dir=參數,是否是很慢還容易出錯,下降效率呢?
不過不用擔憂,咱們能夠把--exclude-dir=參數經過加入配置文件 ~/.bashrc (這是bash的當前用戶配置文件) 的方法來簡化操做,提升效率。
在~/.bashrc文件的末尾添加如下命令:
export GREP_OPTIONS="--exclude-dir=\.svn"
而後保存,執行source ~/.bashrc或者. ~/.bashrc,使修改起做用。
而後搜索時,執行如下命令便可:
grep -nr MediaButton *
這樣默認就會加載GREP_OPTIONS選項,不搜索.svn目錄。
須要注意的是,GREP_OPTIONS這個關鍵詞不能修改成其餘的,不然系統就不會認爲是grep的一個選項參數了。
Linux系統中grep命令是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹 配的行打印出來。grep全稱是Global Regular Expression Print,表示全局正則表達式版本,它的使用權限是全部用戶。
#2.格式
grep [options]
#3.主要參數
[options]主要參數:
-c:只輸出匹配行的計數。
-I:不區分大 小寫(只適用於單字符)。
-h:查詢多文件時不顯示文件名。
-l:查詢多文件時只輸出包含匹配字符的文件名。
-n:顯示匹配行及 行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
-v:顯示不包含匹配文本的全部行。
pattern正則表達式主要參數:
\: 忽略正則表達式中特殊字符的原有含義。
^:匹配正則表達式的開始行。 $: 匹配正則表達式的結束行。 \<:從匹配正則表達 式的行開始。 \>:到匹配正則表達式的行結束。 [ ]:單個字符,如[A]即A符合要求 。 [ - ]:範圍,如[A-Z],即A、B、C一直到Z都符合要求 。 。:全部的單個字符。 * :有字符,長度能夠爲0。
#4.grep命令使用簡單實例 $ grep ‘test’ d* 顯示全部以d開頭的文件中包含 test的行。 $ grep ‘test’ aa bb cc 顯示在aa,bb,cc文件中匹配test的行。 $ grep ‘[a-z]\{5\}’ aa 顯示全部包含每一個字符串至少有5個連續小寫字符的字符串的行。 $ grep ‘w\(es\)t.*\1′ aa 若是west被匹配,則es就被存儲到內存中,並標記爲1,而後搜索任意個字符(.*),這些字符後面緊跟着 另一個es(\1),找到就顯示該行。若是用egrep或grep -E,就不用」\」號進行轉義,直接寫成’w(es)t.*\1′就能夠了。
#5.grep命令使用複雜實例 假設您正在’/usr/src/Linux/Doc’目錄下搜索帶字符 串’magic’的文件: $ grep magic /usr/src/Linux/Doc/* sysrq.txt:* How do I enable the magic SysRQ key? sysrq.txt:* How do I use the magic SysRQ key? 其中文件’sysrp.txt’包含該字符串,討論的是 SysRQ 的功能。 默認狀況下,’grep’只搜索當前目錄。若是 此目錄下有許多子目錄,’grep’會以以下形式列出: grep: sound: Is a directory 這可能會使’grep’ 的輸出難於閱讀。這裏有兩種解決的辦法: 明確要求搜索子目錄:grep -r 或忽略子目錄:grep -d skip 若是有不少 輸出時,您能夠經過管道將其轉到’less’上閱讀: $ grep magic /usr/src/Linux/Documentation/* | less 這樣,您就能夠更方便地閱讀。 #有一點要注意,您必需提供一個文件過濾方式(搜索所有文件的話用 *)。若是您忘了,’grep’會一直等着,直到該程序被中斷。若是您遇到了這樣的狀況,按 <CTRL c> ,而後再試。 #下面還有一些有意思的命令行參數: grep -i pattern files :不區分大小寫地搜索。默認狀況區分大小寫, grep -l pattern files :只列出匹配的文件名, grep -L pattern files :列出不匹配的文件名, grep -w pattern files :只匹配整個單詞,而不是字符串的一部分(如匹配’magic’,而不是’magical’), grep -C number pattern files :匹配的上下文分別顯示[number]行, grep pattern1 | pattern2 files :顯示匹配 pattern1 或 pattern2 的行, grep pattern1 files | grep pattern2 :顯示既匹配 pattern1 又匹配 pattern2 的行。 #grep -n pattern files 便可顯示行號信息 #grep -c pattern files 便可查找總行數 #這裏還有些用於搜索的特殊符號: \< 和 \> 分別標註單詞的開始與結尾。 例如: grep man * 會匹配 ‘Batman’、’manic’、’man’等, grep ‘\<man’ * 匹配’manic’和’man’,但不是’Batman’, grep ‘\<man\>’ 只匹配’man’,而不是’Batman’或’manic’等其餘的字符串。 ‘^’:指匹配的字符串在行首, ‘$’:指匹配的字符串在行 尾, #Grep 命令 用法大全 一、參數: -I :忽略大小寫 -c :打印匹配的行數 -l :從多個文件中查找包含匹配項 -v :查找不包含匹配項的行 -n:打印包含匹配項的行和行標
二、RE(正則表達式) \ 忽略正則表達式中特殊字符的原有含義 ^ 匹配正則表達式的開始行 $ 匹配正則表達式的結束行 \< 從匹配正則表達式的行開始 \> 到匹配正則表達式的行結束 [ ] 單個字符;如[A] 即A符合要求 [ - ] 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 . 全部的單個字符 * 全部字符,長度能夠爲0
三、舉例 # ps -ef | grep in.telnetd root 19955 181 0 13:43:53 ? 0:00 in.telnetd # more size.txt size文件的內容 b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 ## more size.txt | grep '[a-b]' 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 b124230 b034325 a081016 a022021 a061048 b103303 a013386 b044525 # more size.txt | grep '[a-b]'* b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 ## more size.txt | grep 'b' 單個字符;如[A] 即A符合要求 b124230 b034325 b103303 b044525 # more size.txt | grep '[bB]' b124230 b034325 b103303 b044525 B081016 B103303 BADc2345 ## grep 'root' /etc/group root::0:root bin::2:root,bin,daemon sys::3:root,bin,sys,adm adm::4:root,adm,daemon uucp::5:root,uucp mail::6:root tty::7:root,tty,adm lp::8:root,lp,adm nuucp::9:root,nuucp daemon::12:root,daemon ## grep '^root' /etc/group 匹配正則表達式的開始行 root::0:root ## grep 'uucp' /etc/group uucp::5:root,uucp nuucp::9:root,nuucp ## grep '\<uucp' /etc/group# uucp::5:root,uucp ## grep 'root$' /etc/group 匹配正則表達式的結束行 root::0:root mail::6:root ## more size.txt | grep -i 'b1..*3' -i :忽略大小寫 #b124230 b103303 B103303 ## more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配項的行 #b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 a013386 b044525 m8987131 B081016 M45678 BADc2345 ## more size.txt | grep -in 'b1..*3' 1:b124230 9:b103303 15:B103303 ## grep '$' /etc/init.d/nfs.server | wc -l 128 # grep '\$' /etc/init.d/nfs.server | wc –l 忽略正則表達式中特殊字符的原有含義 #15 # grep '\$' /etc/init.d/nfs.server case "$1" in >/tmp/sharetab.$$ [ "x$fstype" != xnfs ] && echo "$path\t$res\t$fstype\t$opts\t$desc" >>/tmp/sharetab.$$ /usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.$$ /usr/bin/mv -f /tmp/sharetab.$$ /etc/dfs/sharetab if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)' if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && if [ $startnfsd -ne 0 ]; then elif [ ! -n "$_INIT_RUN_LEVEL" ]; then while [ $wtime -gt 0 ]; do wtime=`expr $wtime - 1` if [ $wtime -eq 0 ]; then echo "Usage: $0 { start | stop }" ## more size.txt #the test file their are files The end ## grep 'the' size.txt the test file their are files ## grep '\<the' size.txt the test file their are files ## grep 'the\>' size.txt the test file ## grep '\<the\>' size.txt the test file ## grep '\<[Tt]he\>' size.txt the test file
#================================================================== #1,簡介 使用正則表達式的一個多用途文本搜索工具.這個php?name=%C3%FC%C1%EE" onclick="tagshow(event)" class="t_tag">命令原本是ed行編輯器中的一個php?name=%C3%FC%C1%EE" onclick="tagshow(event)" class="t_tag">命令/過濾器: g/re/p -- global - regular expression - print. 基本格式 grep pattern [file...] (1)grep 搜索字符串 [filename] (2)grep 正則表達式 [filename] 在文件中搜索全部 pattern 出現的位置, pattern 既能夠是要搜索的字符串,也能夠是一個正則表達式. 注意:在輸入要搜索的字符串時最好使用雙引號/而在模式匹配使用正則表達式時,注意使用單引號
2,grep的選項 -c 只輸出匹配行的計數 -i 不區分大小寫(用於單字符) -n 顯示匹配的行號 -v 不顯示不包含匹配文本的因此有行 -s 不顯示錯誤信息 -E 使用擴展正則表達式 更多的選項請查看:man grep
3,經常使用grep實例 #(1)多個文件查詢 grep "sort" *.doc #見文件名的匹配 (2)行匹配:輸出匹配行的計數 grep -c "48" data.doc #輸出文檔中含有48字符的行數 (3)顯示匹配行和行數 grep -n "48" data.doc #顯示全部匹配48的行和行號 (4)顯示非匹配的行 grep -vn "48" data.doc #輸出全部不#包含48的行 (4)顯示非匹配的行 grep -vn "48" data.doc #輸出全部不包含48的行 (5)大小寫敏感 grep -i "ab" data.doc #輸出全部含有ab或Ab的字符串的行
4, 正則表達式的應用 (1)正則表達式的應用 (注意:最好把正則表達式用單引號括起來) grep '[239].' data.doc #輸出全部含有以2,3或9開頭的,而且是兩個數字的行 (2)不匹配測試 grep '^[^48]' data.doc #不匹配行首是48的行 (3)使用擴展模式匹配 grep -E '219|216' data.doc (4) ... 這須要在實踐中不斷應用和總結,熟練掌握正則表達式。
5, 使用類名 可使用國際模式匹配的類名: [[:upper:]] [A-Z] [[:lower:]] [a-z] [[:digit:]] [0-9] [[:alnum:]] [0-9a-zA-Z] [[:space:]] 空格或tab [[:alpha:]] [a-zA-Z] (1)使用 grep '5[[:upper:]][[:upper:]]' data.doc #查詢以5開頭以兩個大寫字母結尾的行
Linux正則表達式grep與egrep
正則表達式:它是指一個用來描述或者匹配一系列符合某個句法規則的字符串的單個字符串。在不少文本編輯器或其餘工具裏,正則表達式一般被用來檢索或替換那些符合某個模式的文本內容。
其實正則表達式,只是一種思想,一種表示方法。只要咱們使用的工具支持表示這種思想那麼這個工具就能夠處理正則表達式的字符串。經常使用的工具備grep, sed, awk,這三個都是針對文本的行才操做的。
grep 過濾器
語法: grep [-cinvABC] 'word' filename
-n 顯示行號
-c count統計符合要求的行數
-v 取反,不包含所選字符的
-i 不區分大小寫
-r 會把目錄下面全部的文件遍歷 例如: grep -r 'root' ./
-A 後面跟數字,A2表示打印符合要求的行及下面二行
-B 後面跟數字,B2表示打印符合要求的行及上面二行
-C 後面跟數字,C2表示打印符合要求的行及上下各二行
^ 行首,開頭
$ 行尾,結尾
空行用 ^$ 表示
能夠作一個別名alias grep="grep --color" 寫入到.bashrc裏面;之後輸入grep命令時查找的關鍵字符會顏色顯示,方便區分。
過濾帶有某個關鍵詞的行並輸出行號,顏色顯示關鍵詞
[root@localhost ~]# grep -n --color 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -o --color 'root' passwd | wc -l
4
加-o 統計包含關鍵詞的個數;
過濾不帶有某個關鍵詞的行,並輸出行號;
[root@ linuxidc.com ~]# grep -nv 'nologin' /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:user1:x:600:501::/home/user1:/bin/bash
23:mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
過濾以nologin結尾的,系統禁止登錄的全部用戶;
[root@localhost ~]# grep 'nologin$' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
示例,打印關鍵字halt所在行的A2 B2 C2
[root@ linuxidc.com ~]# grep -A2 'halt' passwd
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@ linuxidc.com ~]# grep -B2 'halt' passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
[root@ linuxidc.com ~]# grep -C2 'halt' passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
把全部以#號開頭的行去除
[root@ linuxidc.com ~]# grep -v '^#' /etc/inittab
id:3:initdefault:
去除全部空行和以#號開頭的行
[root@ linuxidc.com ~]# grep -v '^#' /etc/crontab |grep -v '^$'
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
示例說明,打印數字或字母開頭,及不是字母和數字開頭的;
[root@ linuxidc.com tmp]# cat test.txt
helloworld
abc
abc11111
#differt
12345
67899
123def
[0-9]表明任意一個數字,整個命令意思篩選出包含任意一個數字的行;
[root@ linuxidc.com tmp]# grep '[0-9]' test.txt
abc11111
12345
67899
123def
[^0-9]表明除0-9以外的任意一個字符,整個命令的意思是篩選出不包含數字的行;
[root@ linuxidc.com tmp]# grep '[^0-9]' test.txt
helloworld
abc
abc11111
#differt
123def
^[^0-9]表明不是數字開頭的;
[root@ linuxidc.com tmp]# grep '^[^0-9]' test.txt
helloworld
abc
abc11111
#differt
[a-z]表明任意一個英文字母;
[root@ linuxidc.com tmp]# grep '[a-z]' test.txt
helloworld
abc
abc11111
#differt
123def
[^a-z]表明除英文字母之外的;
[root@ linuxidc.com tmp]# grep '[^a-z]' test.txt
abc11111
#differt
12345
67899
123def
^[^a-z]表明不是英文字母開頭的文本;
[root@ linuxidc.com tmp]# grep '^[^a-z]' test.txt
#differt
12345
67899
123def
[ ] 若是是數字的話就用[0-9]這樣的形式,固然有時候也能夠用這樣的形式[15]即只含有1或者5,注意,它不會認爲是15。若是要過濾出數字以及大小寫 字母則要這樣寫[0-9a-zA-Z]。另外[ ]還有一種形式,就是[^字符] 表示除[ ]內的字符以外的字符。
過濾任意一個字符與重複字符
[root@ linuxidc.com ~]# grep 'h..t' /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
'.'點表示任意的一個字符,上面例子爲把符合h與t之間有2個任意字符的行過濾出來。
'*'表明零個或多個任意的字符
'ooo*'表明oo,ooo,oooo 或者更多的o
[root@ linuxidc.com ~]# grep 'ooo*' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
'.*'表示零個或多個任意字符,等於全部的,空行也包含在內。
[root@ linuxidc.com ~]# grep '.*' /etc/passwd |wc -l
24
[root@ linuxidc.com ~]# wc -l /etc/passwd
24 /etc/passwd
指定要過濾字符出現的次數
{ }內部爲數字,表示前面字符要重複的次數。表示兩個O即包含OO的行。{ }左右都須要加脫意字符\
grep -E 表明加強版的grep即egrep,使用egrep不須要脫意;
123456789 [root@ linuxidc.com ~]# grep 'o\{2\}' /etc/passwd
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
[root@localhost ~]# grep -E 'o{2}' passwd
[root@localhost ~]# egrep 'o{2}' passwd
[root@ linuxidc.com ~]# cat test.txt
root:hot
abcde
spoool
spool
spol
spl
示例,過濾字母o出現1到3次的行
[root@ linuxidc.com ~]# grep 'o\{1,3\}' test.txt
root:hot
spoool
spool
spol
{ } 還能夠表示一個範圍,格式爲{n1,n2} n1<n2 表示重複n1到n2次前面的字符,n2還能夠爲空,則表示大於等於n1次。
egrep爲grep的擴展版本,咱們能夠用egrep完成grep不能完成的工做,固然了grep能完成的egrep徹底能夠完成。
grep -E = egrep
一、篩選一個或一個以上前面的字符 字符後面使用+
[root@ linuxidc.com ~]# cat test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'o+' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oo+' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo+' test.txt
rooooot:x:0:0/roooooot:/bin/bash
二、篩選零個或一個前面的字符 字符後面使用?
[root@ linuxidc.com ~]# egrep 'o?' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@ linuxidc.com ~]# egrep 'oo?' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'ooo?' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
[root@ linuxidc.com ~]# egrep 'oooo?' test.txt
rooooot:x:0:0/roooooot:/bin/bash
三、篩選字符串1或字符串2 包含裏面任意一個字符串的打印出來
[root@ linuxidc.com ~]# egrep 'aaa|111|ooo' test.txt
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
四、egrep中()的應用
[root@ linuxidc.com ~]# egrep 'r(oo)|(mo)n' test.txt
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
用( )表示一個總體,例如(oo)+ 表示1個'oo'或者多個'oo'
[root@ linuxidc.com ~]# egrep '(oo)+' test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
五、egrep中[ ]的應用
方括號內的字符爲其中的一個;[^o]爲除了字母o以外的;
示例:r開頭t結尾的;;
[root@localhost ~]# egrep 'r[o]t' test.txt
rot:x:0:0:rot:/rot:/bin/bash
r開頭後面有o的
[root@localhost ~]# egrep 'r[o]' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
r開頭後面不是o的;
[root@localhost ~]# egrep 'r[^o]' test.txt
rrt
rtx
t爲結尾的前面字符不是o的;
[root@localhost ~]# egrep '[^o]t' test.txt
rrt
rtx
. * + ? 符號的總結
. 表示任意一個字符(包括特殊字符 空格 # $ ?)
* 表示零個或多個*前面的字符
.* 表示任意個任意字符(包含空行)
+ 表示1個或多個+前面的字符
? 表示0個或1個?前面的字符
其中,+ ? grep不支持,egrep才支持。
"ro.*t" 表示以ro開頭一直到t結尾的
[root@localhost ~]# grep 'ro.*t' test.txt
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash
圖片顯示的更詳細,方便你們理解。
![Linux正則表達式grep與egrep](http://static.javashuo.com/static/loading.gif)
grep若是須要篩選字符串 | 管道須要加脫意\纔可使用;
![Linux正則表達式grep與egrep](http://static.javashuo.com/static/loading.gif)
grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm
Linux下Shell編程——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm
grep 命令詳解及相關事例 http://www.linuxidc.com/Linux/2014-07/104041.htm
Linux基礎命令之grep詳解 http://www.linuxidc.com/Linux/2013-07/87919.htm
設置grep高亮顯示匹配項 http://www.linuxidc.com/Linux/2014-09/106871.htm
Linux grep命令學習與總結 http://www.linuxidc.com/Linux/2014-10/108112.htm
1、 正則表達式:
正則表達式(或稱Regular Expression,簡稱RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(稱爲元字符)組成的文字模式。
該模式描述在查找文字主體時待匹配的一個或多個字符串。
正則表達式做爲一個模板,將某個字符模式與所搜索的字符串進行匹配。簡單的說,正則表示式就是處理字符串的方法,它是以行爲單位來進行字符串的處理行爲, 正則表示式經過一些特殊符號的輔助,可讓使用者輕易的達到搜尋/刪除/取代某特定字符串的處理程序。vim、grep、find、awk、sed等命令都支持正則表達式。
經常使用正則表達式:
1、.表明任意單個字符,如:/l..e/與包含一個l,後跟兩個字符,而後跟一個e的行相匹配
grep ‘l..e’ test
awk ‘/l..e/’ test
cat test(查看文件)
leeet
laat
lae
2、^表明行的開始。 ^love 如:與全部love開頭的行匹配
grep ^le test
3、$表明行的結束。love$ 如:與全部love結尾的行匹配
那麼‘^$’ 就表示空行
grep at$ test
4、[…]匹配括號中的字符之一
[abc] 匹配單個字符a或b或c
[123] 匹配單個字符1或2或3
[a-z] 匹配小寫字母a-z之一
[a-zA-Z] 匹配任意英文字母之一
[0-9a-zA-Z]匹配任意英文字母或數字之一
注意:上面標紅色的單個和之一,無論[]裏面多複雜,它的結果都是一個字符!
grep ‘l[ae]e’ test
awk‘/l[ae]e/’ test
能夠用^標記作[]內的前綴,表示除[]內的字符以外的字符。好比 搜索oo前沒有g的字符串的行. 應用 '[^g]oo'做搜索字符串,^符號若是出現在[]的起始位置表示否認,可是在[]的其餘位置是普通字符。[^9b^c] 匹配b或^或c或不是a的任意單個字符
5、* 用於修飾前導字符,表示前導字符出現0次或任意多次
如:'a*grep'匹配全部0個或多個a後緊跟grep的行。「.*」表示任意字符串
6、\?用於修飾前導字符,表示前導字符出現0或1次
a\? 匹配0或1個a
7、\+用於修飾前導字符,表示前導字符出現1或多次
a\+ 匹配1或多個a
8、\{n,m\} 用於修飾前導字符,表示前導字符出現n至m次(n和m都是整數,且n<m)
a\{3,5\} 匹配3至5個連續的a
\{n,m\}還有其餘幾種形式:
\{n\} 連續的n個前導字符
\{n,\} 連續的至少n個前導字符
9、\ 用於轉義緊跟其後的單個特殊字符,使該特殊字符成爲普通字符
如:^\.[0-9][0-9] 對以一個句點和兩個數字開始
例如:
a* 匹配連續的任意(也包括0)個a
a\? 匹配0或1個a
a\+ 匹配1或多個a
a\{3,5\} 匹配3至5個連續的a
\.* 匹配0或多個連續的. \.表示普通字符句點
sed ‘s/^ *[0-9]*//’ test1
history > test1(先生成test1文件)
10、|表示或 如:a|b|c 匹配a或b或c。如:grep|sed匹配grep或sed
如:egrep ‘grep|sed’ test
11、(),將部份內容合成一個單位組,好比要搜索 glad 或 good能夠以下 'g(la|oo)d'
如:egrep ‘g(la|oo)d’ test
綜合舉例1:
1 Christian Scott lives here and will put ona Christmas party.
2 There are around 30 to 35 people invited.
3 They are:
4 Tom
5 Dan
6 Rhonda Savage
7 Nicky and Kimerly.
8 Steve, Suzanne, Ginger and Larry.
^[A-Z]..$
搜索行以A至Z的一個字母開頭,而後跟兩個任意字母,而後跟一個換行符的行。將找到第5行。
^[A-Z][a-z]*3[0-5]
搜索以一個大寫字母開頭,後跟0個或多個小寫字母,再跟數字3,再跟0—5之間的一個數字。沒法找到匹配行(改爲^[A-Z][a-z]*.*3[0-5]可找到第2行)
^ *[A-Z][a-z][a-z]$
搜索以0個或多個空格開頭,跟一個大寫字母,兩個小寫字母和一個換車符。將找到第4行的TOM(整行匹配)和第5行。注意,*前面有一個空格。
綜合舉例2:
# ls -l /bin | grep '^...s'
上面的命令是用來查找suid文件的;
# ls -lR /usr |grep '^...s..s'
上面的命令是用來查找suid和guid的。
2、grep命令的用法
grep (global search regularexpression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來.
參數:
1. -A NUM,--after-context=NUM 除了列出符合行以外,而且列出後NUM行。
如: $ grep –A 1 panda file (從file中搜尋有panda樣式的行,並顯示該行的後1行)
2. -B NUM,--before-context=NUM 與 -A NUM 相對,但這此參數是顯示除符合行以外並顯示在它以前的NUM行。如: (從file中搜尋有panda樣式的行,並顯示該行的前1行)
$ grep -B 1 panda file
3、 -C [NUM], -NUM, --context[=NUM] 列出符合行以外並列出上下各NUM行,默認值是2。
如: (列出file中除包含panda樣式的行外並列出其上下2行)(若要改變默認值,直接改變NUM便可)
$ grep -C[NUM] panda file
4、 -c, --count 不顯示符合樣式行,只顯示符合的總行數。若再加上-v,--invert-match,參數顯示不符合的總行數
5、-i,--ignore-case 忽略大小寫差異
6、-n,--line-number 在匹配的行前面打印行號
7、-v,--revert-match 反檢索,只顯示不匹配的行
8、精確匹配:
例如在抽取字符串「 48」,返回結果包含諸如484和483等包含「48」的其餘字符串,實際上應精確抽取只包含48的各行。
使用grep抽取精確匹配的一種有效方式是在抽取字符串前加\<,在抽取字符串後加\>。假定如今精確抽取48,
方法以下:
#grep '\<48\>' filename
9、-s 不顯示不存在或無匹配文本的錯誤信息
如:執行命令grep "root" /etc/password,由於password文件不存在,因此在屏幕上輸出錯誤信息,若使用grep命令-s開關,可屏蔽錯誤信息
要用好grep這個工具,其實就是要寫好正則表達式,因此這裏不對grep的全部功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。
$ ls -l | grep '^d'
經過管道過濾ls-l輸出的內容,只顯示以d開頭的行。
$ grep 'test' d*
顯示全部以d開頭的文件中包含test的行。
$ grep 'test' aa bb cc
顯示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]\{5,\}' aa
顯示全部包含每一個字符串至少有5個連續小寫字符的字符串的行。
$grep ‘t[a|e]st’ filename
顯示包含test或tast的全部行。
$grep '\.$' filename
顯示以.爲結尾的全部行。
3、sed命令的用法
sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非你使用重定向存儲輸出。
sed的基本命令:
1.替換: s命令
1.1 基本用法
如: sed 's/day/night/' <old >new
該例子將文件 old 中的每一行第一次出現的 day 替換成 night, 將結果輸出到文件 new
s " 替換 " 命令
/../../ 分割符 (Delimiter)
day 搜索字符串
night 替換字符串
其實 , 分割符 "/" 能夠用別的符號代替 , 好比 ",","|" 等 .
如:sed's/\/usr\/local\/bin/\/common\/bin/'<old >new
等價於 sed's_/usr/local/bin_/common/bin_' <old >new
顯然 , 此時用 "_" 做分割符比 "/" 好得多
sed -i 's/anonymous=YES/anonymous=NO/' /etc/vsftpd/vsftpd.conf
1.2 用 & 表示匹配的字符串
有時可能會想在匹配到的字符串周圍或附近加上一些字符 .
如: sed 's/abc/(abc)/' <old >new
該例子在找到的 abc 先後加上括號 .
該例子還能夠寫成 sed 's/abc/(&)/' <old >new
下面是更復雜的例子 :
sed 's/[a-z]*/(&)/' <old >new
sed 默認只替換搜索字符串的第一次出現 , 利用 /g 能夠替換搜索字符串全部
$ sed's/test/mytest/g' example-----在整行範圍內把test替換爲mytest。若是沒有g標記,則只有每行第一個匹配的test被替換成mytest。
$ sed's/^192.168.0.1/&localhost/' example-----&符號表示替換字符串中被找到的部份。全部以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。
$ sed's#10#100#g' example-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,因此,「#」在這裏是分隔符,代替了默認的「/」分隔符。表示把全部10替換成100。
若是須要對同一文件或行做屢次修改,可使用 "-e" 選項
![spacer.gif](http://static.javashuo.com/static/loading.gif)
取得eth0網卡IP地址:
![spacer.gif](http://static.javashuo.com/static/loading.gif)
2.刪除行:d命令
從某文件中刪除包含 "how" 的全部行
![spacer.gif](http://static.javashuo.com/static/loading.gif)
將/etc/passwd的內容顯示並找印行號,同時將2~5刪除
![spacer.gif](http://static.javashuo.com/static/loading.gif)
附:nl命令在linux系統中用來計算文件中行號。nl 能夠將輸出的文件內容自動的加上行號
若是隻要刪除第2行,可使用nl /etc/passwd | sed '2d' 來達成,至於如果要刪除第 3 到最後一行,則是nl /etc/passwd | sed '3,$d'的啦。
3.增長行:a命令(在指定的行後新增)或i命令(在指定的行前新增)
a的後面能夠接字符串,而這些字符串會在新的一行出現
在/etc/passwd的第二行後增長「XXXXX」字樣的新行
![spacer.gif](http://static.javashuo.com/static/loading.gif)
在/etc/passwd的第二行前增長「XXXXX」字樣的新行
![spacer.gif](http://static.javashuo.com/static/loading.gif)
若是要同時新增多行,則每行之間要用反斜槓\來進行新行的添加
![spacer.gif](http://static.javashuo.com/static/loading.gif)
sed -i '/\[global\]/a test' /etc/samba/smb.conf
sed -i '57a test' /etc/samba/smb.conf
4、取代行:c命令
c的後面能夠接字符串,這些字符串能夠取代n1,n2之間的行
![spacer.gif](http://static.javashuo.com/static/loading.gif)
5、打印:p命令
sed '/north/p' datafile 默認輸出全部行,找到north的行重複打印
sed –n '/north/p' datafile 禁止默認輸出,只打印找到north的行
nl /etc/passwd | sed -n '5,7p' 僅列出/etc/passwd文件中的第5~7行內容
注:sed 的-i選項能夠直接修改文件中的內容
![spacer.gif](http://static.javashuo.com/static/loading.gif)
4、awk命令:
awk也是一個數據處理工具!相較於 sed 經常做用於一整個行的處理, awk 則比較傾向於一行當中分紅數個字段來處理。
.awk語言的最基本功能是在文件或字符串中基於指定規則來分解抽取信息,也能夠基於指定的規則來輸出數據。
1.命令格式
awk [-F field-separator] 'commands' input-files
其中,[-F域分隔符]是可選的,由於awk使用空格或tab鍵做爲缺省的域分隔符,所以若是要瀏覽域間有空格的文本,沒必要指定這個選項,若是要瀏覽諸如passwd文件,此文件各域以冒號做爲分隔符,則必須指明-F選項,如:awk -F: 'commands' input-file。
awk的模式和動做
任何awk語句都由模式和動做組成(awk_pattern { actions })。
在一個awk腳本中可能有許多語句。
模式部分決定動做語句什麼時候觸發及觸發事件。處理即對數據進行的操做。若是省略模式部分,動做將時刻保持執行狀態。即省略時不對輸入記錄進行匹配比較就執行相應的actions。
模式能夠是任何條件語句或正則表達式等。awk_pattern能夠是如下幾種類型:
1) 正則表達式用做awk_pattern: /regexp/
例如:awk '/ ^[a-z]/' input_file
2) 布爾表達式用做awk_pattern,表達式成立時,觸發相應的actions執行。
① 表達式中可使用變量(如字段變量$1,$2等)和/regexp/
② 布爾表達式中的操做符:
關係操做符: < > <= >= == !=
匹配操做符: value ~ /regexp/ 若是value匹配/regexp/,則返回真
value !~ /regexp/ 若是value不匹配/regexp/,則返回真
例如: awk '$2 > 10 {print"ok"}' input_file
awk '$3 ~ /^d/ {print"ok"}' input_file
③ &&(與)和 ||(或) 能夠鏈接兩個/regexp/或者布爾表達式,構成混合表達式。!(非) 能夠用於布爾表達式或者/regexp/以前。
例如: awk '($1 < 10 ) && ($2> 10) {print "ok"}' input_file
awk '/^d/ || /x$/ {print"ok"}' input_file
模式包括兩個特殊字段 BEGIN和END。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依據輸入文本開始執行。END語句用來在awk完成文本瀏覽動做後打印輸出文本總數和結尾狀態標誌。
實際動做在大括號{ }內指明。動做大多數用來打印,可是還有些更長的代碼諸如i f和循環語句及循環退出結構。若是不指明採起動做,awk將打印出全部瀏覽出來的記錄。
awk執行時,其瀏覽域標記爲$1,$2...$n。這種方法稱爲域標識。使用這些域標識將更容易對域進行進一步處理。
使用$1 , $3表示參照第1和第3域,注意這裏用逗號作域分隔。若是但願打印一個有5個域
的記錄的全部域,沒必要指明$1 ,$2 , $3 , $4 , $5,可以使用$0,意即全部域。
爲打印一個域或全部域,使用print命令。這是一個awk動做
awk的運行過程:
① 若是BEGIN區塊存在,awk執行它指定的actions。
② awk從輸入文件中讀取一行,稱爲一條輸入記錄。(若是輸入文件省略,將從標準輸入讀取)
③ awk將讀入的記錄分割成字段,將第1個字段放入變量$1中,第2個字段放入$2,以此類推。$0表示整條記錄。
④ 把當前輸入記錄依次與每個awk_cmd中awk_pattern比較,看是否匹配,若是相匹配,就執行對應的actions。若是不匹配,就跳過對應的actions,直到比較完全部的awk_cmd。
⑤ 當一條輸入記錄比較了全部的awk_cmd後,awk讀取輸入的下一行,繼續重複步驟③和④,這個過程一直持續,直到awk讀取到文件尾。
⑥ 當awk讀完全部的輸入行後,若是存在END,就執行相應的actions。
入門實例:
例1:顯示/etc/passwd文件中的用戶名和登陸shell
![spacer.gif](http://static.javashuo.com/static/loading.gif)
若是隻是顯示/etc/passwd的帳戶和帳戶對應的shell,而帳戶與shell之間以tab鍵分割
![spacer.gif](http://static.javashuo.com/static/loading.gif)
若是隻是顯示/etc/passwd文件中的用戶名和登陸shell, 而帳戶與shell之間以逗號分割
![spacer.gif](http://static.javashuo.com/static/loading.gif)
注:awk的老是輸出到標準輸出,若是想讓awk輸出到文件,可使用重定向。
例2:顯示/etc/passwd文件中的UID大於500的全部用戶的用戶名和登陸shell
![spacer.gif](http://static.javashuo.com/static/loading.gif)
例3:若是隻是顯示/etc/passwd文件中的UID大於500的用戶名和登陸shell,而帳戶與shell之間以逗號分割,並且在全部行添加列名name,shell,在最後一行添加"blue,/bin/nosh"。
![spacer.gif](http://static.javashuo.com/static/loading.gif)
注:
1.awk 後面接兩個單引號並加上大括號 {} 來設定想要對數據進行的處理動做
2.awk工做流程是這樣的:先執行BEGING,而後讀取文件,讀入有\n換行符分割的一條記錄,而後將記錄按指定的域分隔符劃分域,填充域,$0則表示全部域,$1表示第一個域,$n表示第n個域,隨後開始執行模式所對應的動做。接着開始讀入第二條記錄······直到全部的記錄都讀完,最後執行END操做。
思考題:如何打印全部記錄(以/etc/passwd中的內容爲例)
![spacer.gif](http://static.javashuo.com/static/loading.gif)
例4:搜索/etc/passwd有root關鍵字的全部行
這種是pattern(模式)的使用示例,匹配了pattern(這裏是root)的行纔會執行action(沒有指定action,默認輸出每行的內容)。
搜索支持正則表達式,例如找root開頭的:
![spacer.gif](http://static.javashuo.com/static/loading.gif)
搜索/etc/passwd有root關鍵字的全部行,並顯示對應的shell
![spacer.gif](http://static.javashuo.com/static/loading.gif)
這裏指定了action是{print $7}
分類: shell 2014-06-24 11:27 1876人閱讀
grep用法詳解:grep與正則表達式
首先要記住的是: 正則表達式與通配符不同,它們表示的含義並不相同!
正則表達式只是一種表示法,只要工具支持這種表示法,那麼該工具就能夠處理正則表達式的字符串。vi grep ,awk ,sed 等都支持正則表達式.
1基礎正則表達式
grep 工具,之前介紹過。
grep -[acinv] '搜索內容串' filename
-a 以文本文件方式搜索
-c 計算找到的符合行的次數
-i 忽略大小寫
-n 順便輸出行號
-v 反向選擇,即找 沒有搜索字符串的行
其中搜索串能夠是正則表達式!
1
搜索有the的行,並輸出行號
$grep -n 'the' regular_express.txt
搜索沒有the的行,並輸出行號
$grep -nv 'the' regular_express.txt
2 利用[]搜索集合字符
[] 表示其中的某一個字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
能夠用^符號作[]內的前綴,表示除[]內的字符以外的字符。
好比搜索oo前沒有g的字符串所在的行. 使用 '[^g]oo' 做搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 內能夠用範圍表示,好比[a-z] 表示小寫字母,[0-9] 表示0~9的數字, [A-Z] 則是大寫字母們。[a-zA-Z0-9]表示全部數字與英文字符。 固然也能夠配合^來排除字符。
搜索包含數字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首與行尾字符 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字符,是位置)那麼‘^$’ 就表示空行,由於只有
行首和行尾。
這裏^與[]裏面使用的^意義不一樣。它表示^後面的串是在行的開頭。
好比搜索the在開頭的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小寫字母開頭的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索開頭不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的結尾,好比 '\.' 表示 . 在一行的結尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '\.$' regular_express.txt //. 是正則表達式的特殊符號,因此要用\轉義
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系統下生成的文本文件,換行會加上一個 ^M 字符。因此最後的字符會是隱藏的^M ,在處理Windows
下面的文本時要特別注意!
能夠用cat dos_file | tr -d '\r' > unix_file 來刪除^M符號。 ^M==\r
那麼'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
..........
任意一個字符. 與重複字符 *
在bash中*表明通配符,用來表明任意個字符,可是在正則表達式中,他含義不一樣,*表示有0個或多個 某個字符。
例如 oo*, 表示第一個o必定存在,第二個o能夠有一個或多個,也能夠沒有,所以表明至少一個o.
點. 表明一個任意字符,必須存在。 g??d 能夠用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。
woody@xiaoc:~/tmp$ grep -n 'g..d' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
9:Oh! the soup taste good!
16:The world is the same with 'glad'.
woody@xiaoc:~/tmp$
搜索兩個o以上的字符串
woody@xiaoc:~/tmp$ grep -n 'ooo*' regular_express.txt //前兩個o必定存在,第三個o可沒有,也可有多個。
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g開頭和結尾,中間是至少一個o的字符串,即gog, goog....gooog...等
woody@xiaoc:~/tmp$ grep -n 'goo*g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g開頭和結尾的字符串在的行
woody@xiaoc:~/tmp$ grep -n 'g.*g' regular_express.txt // .*表示 0個或多個任意字符
1:"Open Source" is a good mechanism to develop programs.
14:The gd software is a library for drafting programs.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
限定連續重複字符的範圍 { }
. * 只能限制0個或多個, 若是要確切的限制字符重複數量,就用{範圍} 。範圍是數字用,隔開 2,5 表示2~5個,
2表示2個,2, 表示2到更多個
注意,因爲{ }在SHELL中有特殊意義,所以做爲正則表達式用的時候要用\轉義一下。
搜索包含兩個o的字符串的行。
woody@xiaoc:~/tmp$ grep -n 'o\{2\}' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
9:Oh! the soup taste good!
18:google is the best tools for search keyword.
19:goooooogle yes!
搜索g後面跟2~5個o,後面再跟一個g的字符串的行。
woody@xiaoc:~/tmp$ grep -n 'go\{2,5\}g' regular_express.txt
18:google is the best tools for search keyword.
搜索包含g後面跟2個以上o,後面再跟g的行。。
woody@xiaoc:~/tmp$ grep -n 'go\{2,\}g' regular_express.txt
18:google is the best tools for search keyword.
19:goooooogle yes!
注意,相讓[]中的^ - 不表現特殊意義,能夠放在[]裏面內容的後面。
'[^a-z\.!^ -]' 表示沒有小寫字母,沒有. 沒有!, 沒有空格,沒有- 的 串,注意[]裏面有個小空格。
另外shell 裏面的反向選擇爲[!range], 正則裏面是 [^range]
2擴展正則表達式
擴展正則表達式是對基礎正則表達式添加了幾個特殊構成的。
它令某些操做更加方便。
好比咱們要去除 空白行和行首爲 #的行, 會這樣用:
woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#'
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
............
然而使用支持擴展正則表達式的 egrep 與擴展特殊符號 | ,會方便許多。
注意grep只支持基礎表達式, 而egrep 支持擴展的,其實 egrep 是 grep -E 的別名而已。所以grep -E 支持擴展正則。
那麼:
woody@xiaoc:~/tmp$ egrep -v '^$|^#' regular_express.txt
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
....................
這裏| 表示或的關係。 即知足 ^$ 或者 ^# 的字符串。
這裏列出幾個擴展特殊符號: +,於 . * 做用相似,表示 一個或多個重複字符。 ?, 於 . * 做用相似,表示0個或一個字符。
|,表示或關係,好比 'gd|good|dog' 表示有gd,good或dog的串 (),將部份內容合成一個單元組。好比 要搜索 glad 或 good 能夠這樣 'g(la|oo)d' ()的好處是能夠對小組使用 + ? * 等。 好比要搜索A和C開頭結尾,中間有至少一個(xyz) 的串,能夠這樣 : 'A(xyz)+C'
◎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
grep參數
1. -c 顯示匹配的行數(就是顯示有多少行匹配了);
2. -n 顯示匹配內容所在文檔的行號;
3. -i 匹配時忽略大小寫;
4. -s 錯誤信息不輸出;
5. -v 輸出不匹配內容;
6. -x 輸出徹底匹配內容;
7. \ 忽略表達式中字符原有含義;
8. ^ 匹配表達式的開始行;
9. $ 匹配表達式的結束行;
10. \< 從匹配表達式的行開始;
11. \> 到匹配表達式的行結束;
12. [ ] 單個字符(如[A] 即A符合要求);
13. [ - ] 範圍;如[A-Z]即A,B,C一直到Z都符合要求;
14. . 全部的單個字符;
15. * 全部字符,長度能夠爲0;
[精華] Grep 用法 |
|
|
|
Grep : g (globally) search for a re (regular expression ) and p (print ) the results. 1、參數: -I :忽略大小寫 -c :打印匹配的行數 -l :從多個文件中查找包含匹配項 -v :查找不包含匹配項的行 -n:打印包含匹配項的行和行標 二、RE(正則表達式) \ 忽略正則表達式中特殊字符的原有含義 ^ 匹配正則表達式的開始行 $ 匹配正則表達式的結束行 \< 從匹配正則表達式的行開始 \>; 到匹配正則表達式的行結束 [ ] 單個字符;如[A] 即A符合要求 [ - ] 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 . 全部的單個字符 * 全部字符,長度能夠爲0 三、舉例 # ps -ef | grep in.telnetd root 19955 181 0 13:43:53 ? 0:00 in.telnetd # more size.txt size文件的內容 b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 # more size.txt | grep '[a-b]' 範圍 ;如[A-Z]即A,B,C一直到Z都符合要求 b124230 b034325 a081016 a022021 a061048 b103303 a013386 b044525 # more size.txt | grep '[a-b]'* b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 # more size.txt | grep '' 單個字符;如[A] 即A符合要求 b124230 b034325 b103303 b044525 # more size.txt | grep '[bB]' b124230 b034325 b103303 b044525 B081016 B103303 BADc2345 # grep 'root' /etc/group root::0:root bin::2:root,bin,daemon sys::3:root,bin,sys,adm adm::4:root,adm,daemon uucp::5:root,uucp mail::6:root tty::7:root,tty,adm lp::8:root,lp,adm nuucp::9:root,nuucp daemon::12:root,daemon # grep '^root' /etc/group 匹配正則表達式的開始行 root::0:root # grep 'uucp' /etc/group uucp::5:root,uucp nuucp::9:root,nuucp # grep '\<uucp' /etc/group uucp::5:root,uucp # grep 'root$' /etc/group 匹配正則表達式的結束行 root::0:root mail::6:root # more size.txt | grep -i 'b1..*3' -i :忽略大小寫 b124230 b103303 B103303 # more size.txt | grep -iv 'b1..*3' -v :查找不包含匹配項的行 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 a013386 b044525 m8987131 B081016 M45678 BADc2345 # more size.txt | grep -in 'b1..*3' 1:b124230 9:b103303 15:B103303 # grep '$' /etc/init.d/nfs.server | wc -l 128 # grep '\$' /etc/init.d/nfs.server | wc –l 忽略正則表達式中特殊字符的原有含義 15 # grep '\$' /etc/init.d/nfs.server case "$1" in >;/tmp/sharetab.
[ "x$fstype" != xnfs ] && \ echo "$path\t$res\t$fstype\t$opts\t$desc" \ >;>;/tmp/sharetab.
/usr/bin/touch -r /etc/dfs/sharetab /tmp/sharetab.
/usr/bin/mv−f/tmp/sharetab.
/etc/dfs/sharetab if [ -f /etc/dfs/dfstab ] && /usr/bin/egrep -v '^[ ]*(#|$)' \ if [ $startnfsd -eq 0 -a -f /etc/rmmount.conf ] && \ if [ $startnfsd -ne 0 ]; then elif [ ! -n "$_INIT_RUN_LEVEL" ]; then while [ $wtime -gt 0 ]; do wtime=`expr $wtime - 1` if [ $wtime -eq 0 ]; then echo "Usage: $0 { start | stop }" # more size.txt the test file their are files The end # grep 'the' size.txt the test file their are files # grep '\<the' size.txt the test file their are files # grep 'the\>;' size.txt the test file # grep '\<the\>;' size.txt the test file # grep '\<[Tt]he\>;' size.txt the test file The end |
|
何爲轉義:將特殊符號當普通符號來處理
筆記:
1.^在[]內外的含義
2.什麼時候須要轉義
3.*在bash中和正則表達式中自己的區別
4.-acinv
正則表達式是一種符號表示法,用於識別文本模式。Linux處理正則表達式的主要程序是grep。grep搜索與正則表達式匹配的行,並將結果輸送至標準輸出。
1. grep匹配模式
grep按下述方式接受選項和參數(其中,regex表示正則表達式)
1
|
grep [options] regex [files]
|
其中options主要爲下表:
選項 |
含義 |
功能描述 |
-i |
ignore case |
忽略大小寫 |
-v |
invert match |
不匹配匹配的 |
-l |
file-with-match |
輸出匹配的文件名 |
-L |
file-without-match |
輸出不匹配的文件名 |
-c |
count |
輸出匹配的數目(行數) |
-n |
number |
輸出匹配行的同時在前面加上文件名及在文件名中的行數 |
-h |
no-filename |
抑制文件名的輸出 |
舉例說明
假設有三個文件del一、del二、del3三個文件的內容以下
![](http://static.javashuo.com/static/loading.gif)
例子
![](http://static.javashuo.com/static/loading.gif)
2. 特殊字符
符號 |
含義 |
舉例 |
^ |
開始標記 |
"^abc"知足的例子abc、abcd |
^ |
非(在[]內) |
"[^abc]"知足的例子:ddd、mpd |
$ |
結束標記 |
」abc$」知足的例子abc、mmabc |
. |
任意字符 |
"a.c"知足的例子abc、fapcc |
\< |
匹配單詞開始 |
"\<abc"知足的例子abc、abcd |
\> |
匹配單詞結束 |
"abc\>"知足的例子abc、pmrabc |
| |
或 |
"AAA|BBB"知足的例子AAA、BBBpp |
3. 範圍
符號 |
含義 |
舉例 |
? |
匹配前一個字符0或1次 |
"abc?"知足的例子ab、mabcd |
* |
匹配前一個字符≥0次 |
"abc*"知足的例子abbb、abcdk |
+ |
匹配前一個字符≥1次 |
"abc+"知足的例子abcd、abcccdd |
{} |
{m}、{m,n}、{m,}、{,n}分別爲匹配前一個字符m次、m到n次、≥m次、≤n次 |
"abc\{3,5\}"知足的例子abcccc、abcccccc |
[] |
[]內若是不是範圍,選其一;是範圍的話,範圍內選其一 |
"m[abc]p"知足的例子acpd;m[1-9]p知足的例子m8pp |
() |
將候選的全部元素放在()內,用|隔開 |
"a(1|2|3)bc"知足的例子a1bc、mba3bcd |
注意:{}在鄭則表達式中須要轉移,而{}()不須要。
注意理解{}範圍的例子:
![](http://static.javashuo.com/static/loading.gif)
4. 標準字符類
字符類 |
釋義 |
[:alnum:] |
字母和數字,與[A-Za-z0-9]等價 |
[:word:] |
[:alnum:]加上下劃線_ |
[:alpa:] |
字母,與[A-Za-z]等價 |
[:digit:] |
數字,與[0-9]等價 |
[:xdigit:] |
十六進制字符,與[0-9A-Fa-f等價] |
[:blank:] |
空格和製表符 |
[:graph:] |
可見字符,靠擴33~126 |
[:lower:] |
小寫字母 |
[:upper:] |
大寫字母 |
[:print:] |
可打印字符 |
[:space:] |
空白字符,等價於[\t\r\n\v\f] |
[:punct:] |
標點符號 |
[:cntrl:] |
ASCII控制碼,包括字符0~31以及127 |
例子
![](http://static.javashuo.com/static/loading.gif)
可視化正則表達式
工具:Regexper
![](http://static.javashuo.com/static/loading.gif)
Shell正則表達式之grep、sed、awk實操筆記
投稿:junjie 字體:[
增長
減少] 類型:轉載 時間:2014-09-10
這篇文章主要介紹了Shell正則表達式之grep、sed、awk實操筆記,本文使用grep、sed、awk配合正則達到了一些需求和目的,須要的朋友能夠參考下
最近一直在研究shell腳本這塊,恰好閒下來整了下本身手頭上比較好的資料中的一些範例,如下是我整理的鳥哥私房菜裏面正則表達式裏面比較基礎的一些語法詳解,適合新手查閱。
首先先複製一段範例:
複製代碼 代碼以下:
# vi regular_express.txt
-------------------------------
"Open Source" is a good mechanism to develop programs.
apple is my favorite food.
Football game is not use feet only.
this dress doesn't fit me.
However, this dress is about $ 3183 dollars.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
motorcycle is cheap than car.
This window is clear.
the symbol '*' is represented as start.
Oh!My god!
The gd software is a library for drafting programs.
You are the best is mean you are the no. 1.
The world <Happy> is the same with "glad".
I like dog.
google is the best tools for search keyword.
goooooogle yes!
go! go! Let's go.
# I am VBird
--------------------------------
設置語系爲C
複製代碼 代碼以下:
#export LANG=C
grep
1.搜尋特定字符串"the"
注: n爲顯示行號
複製代碼 代碼以下:
# grep -n 'the' regular_express.txt
2.反向搜尋特定字符串"the"
複製代碼 代碼以下:
# grep -vn 'the' regular_express.txt
3.取得任意大小寫"the"的這個字符串
複製代碼 代碼以下:
# grep -in 'the' regular_express.txt
4.利用括號 [] 來搜尋集合字符
搜索test或taste這兩個單詞時,發現他們有共同的't?st',因此能夠這麼搜尋
複製代碼 代碼以下:
# grep -n 't[ae]st' regular_express.txt
這樣其實就是在找t[a]st和t[e]st這兩個分開的字符
若是搜索有 oo 的字符時,則可使用:
複製代碼 代碼以下:
# grep -n 'oo' regular_express.txt
若是搜索oo時不想搜到 oo 前面有 g 的話,咱們能夠利用反向選擇[^]來達成:
複製代碼 代碼以下:
# grep -n '[^g]oo' regular_express.txt
若是搜索oo前面不想有小寫字符,則:
複製代碼 代碼以下:
# grep -n '[^a-z]oo' regular_express.txt
注: 大寫英文/小寫英文/數字 可使用 [a-z]/[A-Z]/[0-9]等方式來書寫,也能夠寫在一塊兒
[a-zA-Z0-9]表示要求字符串是數字以及英文
若是咱們要取得有數字的那行,則:
複製代碼 代碼以下:
# grep -n '[0-9]' regular_express.txt
注:但考慮到語系對編碼順序的影響,所以除了連續編碼使用減號[-]外,也能夠用[:lower:]代替a-z 以及 [:digit:] 代替0-9 使用
複製代碼 代碼以下:
# grep -n '[^[:lower:]]oo' regular_express.txt
# grep -n '[[:digit:]]' regular_express.txt
5.顯示行首爲'the'的字符串
複製代碼 代碼以下:
# grep -n '^the' regular_express.txt
顯示行首是小寫字符
複製代碼 代碼以下:
# grep -n '^[a-z]' regular_express.txt
6.顯示行尾爲點 . 的那一行
複製代碼 代碼以下:
# grep -n '\.$' regular_express.txt
7.顯示5-9行數據
複製代碼 代碼以下:
# cat -An regular_express.txt |head -n 10 |tail -n 6
8.顯示空白行
複製代碼 代碼以下:
# grep -n '^$' regular_express.txt
9.找出g??d字符串,起頭g結束d的四個字符串
複製代碼 代碼以下:
# grep -n 'g..d' regular_express.txt
10. o*表明空字符(就是有沒有字符均可以)或者一個到N個o字符,因此grep -n 'o*' regular_express.txt就會把全部行所有打印出來,
11.oo*表明o+空字符或者一個到N個o字符,因此grep -n 'oo*' regular_express.txt就會把o,oo,ooo等的行所有打印出來
12."goo*g"表明gog,goog,gooog...等
複製代碼 代碼以下:
# grep -n 'goo*g' regular_express.txt
13.找出含g...g字符串的行
注: .表明任意字符, .*則就表明空字符或者一個到N個任意字符
複製代碼 代碼以下:
# grep -n 'g.*g' regular_express.txt
14.找出含有數字的行
複製代碼 代碼以下:
# grep -n '[0-9][0-9]*' regular_express.txt
或# grep -n '[0-9]' regular_express.txt
15.找出含兩個o的字符串
注:{}由於在shell裏有特殊意義,因此須要加跳脫符\來讓其失去意義
複製代碼 代碼以下:
# grep -n 'o\{2\}' regular_express.txt
找出g後含2到5個o而後以g結尾的字符串
複製代碼 代碼以下:
# grep -n 'go\{2,5\}g' regular_express.txt
找出g後含2以上的o而後以g結尾的字符串
複製代碼 代碼以下:
# grep -n 'go\{2,\}g' regular_express.txt
總結:
^word 表示帶搜尋的字符串(word)在行首
word$ 表示帶搜尋的字符串(word)在行尾
. 表示1個任意字符
\ 表示轉義字符,在特殊字符前加\會將本來的特殊字符意義去除
* 表示重複0到無窮多個前一個RE(正則表達式)字符
[list] 表示搜索含有list的字符串
[n1-n2] 表示搜索指定的字符串範圍,例如[0-9] [a-z] [A-Z]等
[^list] 表示反向字符串的範圍,例如[0-9]表示非數字字符,[A-Z]表示非大寫字符範圍
\{n,m\} 表示找出n到m個前一個RE字符
\{n,\} 表示n個以上的前一個RE字符
egrep總結:
+ 表示重複一個或一個以上的前一個RE字符
範例:egrep 'go+d' regular_express.txt
表示搜尋(god)(good)(goood)...等等字符串,o+表明[一個以上的o]
? 表示重複零個或一個的前一個RE字符
範例:egrep 'go?d' regular_express.txt
表示搜尋(gd)(god)字符串,o?表明[空的或1個o]
注:egrep下'go+d'和'go?d'的結果集合就等於grep下的'go*d'
| 表示用或(or)的方式找出數個字符串
範例:egrep 'gd|good|dog' regular_express.txt
表示搜尋(gd)或(god)或(god)字符串,|表明或
() 表示找出羣組字符串
範例:egrep 'g(la|oo)d' regular_express.txt
表示搜尋(glad)或(good)字符串
() +表示找出多個重複羣組的判別
範例: echo 'AxyzxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
表示搜尋開頭是A結尾是C,中間有一個以上的'xyz'字符串
sed:
插入:
1.將/etc/passwd 的內容列出並打印行號,同時,將2-5行刪除顯示
複製代碼 代碼以下:
# nl /etc/passwd | sed '2,5d'
注: sed是sed -e的簡寫, 後接單引號
同上刪除第2行
複製代碼 代碼以下:
# nl /etc/passwd | sed '2d'
同上刪除第三行到最後一行
複製代碼 代碼以下:
# nl /etc/passwd | sed '3,$d'
2.在第二行後加上一行test
複製代碼 代碼以下:
# nl /etc/passwd | sed '2a test'
在第二行前加上一行test
複製代碼 代碼以下:
# nl /etc/passwd | sed '2i test'
在第二行後加入兩行test
複製代碼 代碼以下:
# nl /etc/passwd | sed '2a test \
> test'
替換行:
3.將2-5行內容取代爲 No 2-5 number
複製代碼 代碼以下:
# nl /etc/passwd | sed '2,5c No 2-5 number'
4 列出/etc/passwd 內第5-7行
複製代碼 代碼以下:
# nl /etc/passwd |sed -n '5,7p'
替換字符串:
sed 's/被替換字符串/新字符串/g'
1.獲取本機IP的行
複製代碼 代碼以下:
# /sbin/ifconfig eth0 |grep 'inet addr'
將IP前面的部分予以刪除
複製代碼 代碼以下:
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'
將IP後面的部分刪除
複製代碼 代碼以下:
# /sbin/ifconfig eth0 |grep 'inet addr'| sed 's/^.*addr://g'| sed 's/Bcast:.*$//g'
-------------------
192.168.100.74
-------------------
2.用grep將關鍵詞MAN所在行取出來
複製代碼 代碼以下:
# cat /etc/man.config |grep 'MAN'
刪除批註行
複製代碼 代碼以下:
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'
刪除空白行
複製代碼 代碼以下:
# cat /etc/man.config |grep 'MAN'| sed 's/^#.*$//g'| sed '/^$/d'
3.利用sed將regular_express.txt內每一行若爲.的換成!
注:-i參數會直接修改文本,而並不是直接輸出
複製代碼 代碼以下:
# sed -i 's/.*\.$/\!/g' regular_express.txt
4.利用sed在文本最後一行加入 #This is a test
注: $表明最後一行 a表明行後添加
複製代碼 代碼以下:
# sed -i '$a #This is a test' regular_express.txt
將selinux配置文件enforcing改爲disabled
複製代碼 代碼以下:
# sed -i '6,6c SELINUX=disabled' /etc/selinux/config
延伸正規表示法:
複製代碼 代碼以下:
# grep -v '^$' regular_express.txt |grep -v '^#'
延伸寫法:
複製代碼 代碼以下:
# egrep -v '^$'|'^#' regular_express.txt
1. +表示重複一個或一個以上的前一個RE字符
例如:egrep -n 'go+d' regular_express.txt
普通寫法: grep -n 'goo*d' regular_express.txt
2. ?表示重複零個或一個前一個RE字符
例如: egrep -n 'go?d' regular_express.txt
3. |表示用或的方式找出數個字符串
例如: egrep -n 'gd|good' regular_express.txt
4. ()表示找出羣組字符串
例如: egrep -n 'g(la|oo)d' regular_express.txt
也就是搜尋(glad)或good這兩個字符串
5. ()+多個重複羣組判別
例如: echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'
也就是要找開頭是A結尾是C 中間有一個以上的'xyz'字符串的意思
awk:
1.用last取出登錄數據前五行
複製代碼 代碼以下:
# last -n 5
取出帳號與登錄者IP,且帳號與IP之間以TAB隔開
複製代碼 代碼以下:
# last -n 5 |awk '{print $1 "\t" $3}'
注:$1表明用空格或TAB隔開的第一個字段,以此類推。。
$0表明該行所有字段
複製代碼 代碼以下:
# last -n 5 |awk '{print $1 "\t lines:" NR "\t columes:" NF}'
注: NF表明每一行的$0的字段總數
NR表明目前awk所處的是第幾行數據
FS表明目標分隔符,默認爲空格
2.在/etc/passwd中以:來做爲分段字符,則咱們要查閱第三欄小於10如下的數據,並只列出帳號與第三欄
複製代碼 代碼以下:
# cat /etc/passwd | awk '{FS=":"} $3<10 {print $1 "\t \t"$3}'
注:查詢結果未顯示第一行數據,是由於咱們雖然定義了FS=":" 但卻只能在第二行生效
想讀取第一行就須要BEGIN這個關鍵詞:
複製代碼 代碼以下:
# cat /etc/passwd | awk 'BEGIN {FS=":"} $3<10 {print $1 "\t \t"$3}'
df:
比較兩個文件的差別:
複製代碼 代碼以下:
# diff /etc/rc3.d/ /etc/rc5.d/
-------------------
Only in /etc/rc3.d/: K30spice-vdagentd
Only in /etc/rc5.d/: S70spice-vdagentd
-------------------
實例:
1。統計TCP鏈接狀態
複製代碼 代碼以下:
# netstat -na | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
/^tcp/
過濾出以tcp開頭的行,「^」爲正則表達式用法,以...開頭,這裏是過濾出以tcp開頭的行。
S[]
定義了一個名叫S的數組,在awk中,數組下標一般從 1 開始,而不是 0。
NF
當前記錄裏域個數,默認以空格分隔,如上所示的記錄,NF域個數等於
$NF
表示一行的最後一個域的值,如上所示的記錄,$NF也就是$6,表示第6個字段的值,也就是SYN_RECV或TIME_WAIT等。
S[$NF]
表示數組元素的值,如上所示的記錄,就是S[TIME_WAIT]狀態的鏈接數
++S[$NF]
表示把某個數加一,如上所示的記錄,就是把S[TIME_WAIT]狀態的鏈接數加一
結果就是顯示S數組中最終的數組值
例:S[TIME_WAIT]=最終值 S[TESTABLISHED]=最終值
END
for(key in S)
遍歷S[]數組
print key,」\t」,S[key]
打印數組的鍵和值,中間用\t製表符分割,顯示好一些。
grep基本命令與正則表達式
(2011-08-14 14:55:08)
grep 命令是支持正則表達式的一個多用途文本搜索工具,他的通常格式爲:
grep [選項] [模式] [文件...]
grep命令的選項用於對搜索過程進行補充說明。grep命令的模式十分靈活,能夠是字符串、變量,還能夠是正則表達式。
不管模式是何種形式,只要模式中包含了空格,就須要使用雙引號或單引號將模式引發來。
下面具體說明grep選項的含義和用法。
一、-c選項: -c選項表示輸出匹配字符串行的數量。
例子:#輸出文件00.pem中包含jk的行的數量
二、-n選項:列出全部的匹配行,並輸出行號。
例子:#輸出文件00.pem中包含jk行的行號和行。
$ grep -n jk 00.pem
1:jkfrdjkfdkl
2:dkjfkjkjelkrge
4:frjkj-----------kltijkert
9:fjkdkle;roitoer
13:djkfthe the23
14:the jejk ekj44
$
三、-選項: 顯示不包含模式的全部行。
例子:#輸出文件00.pem中不包含jk的行的數量
$ grep -vc jk 00.pem
12
$
四、-i選項: 表示grep命令不區分大小寫。
例子:#輸出文件00.pem中包含 jk(不論大小寫)的行
$ grep -i jk 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
djkfthe the23
the jejk ekj44
$
五、-h選項: 表示查詢多文件時不顯示文件名。
六、-l選項: 表示只列出符合匹配的文件名,而不列出具體匹配行。
七、-s選項: 表示不顯示不存在或無匹配文本的錯誤信息。
例1:#未使用-s選項,打印錯誤信息
$ grep jk dk 00.pem
grep: dk: 沒有那個文件或目錄
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
例2:#使用-s選項後,不打印錯誤信息
$ grep -s jk dk 00.pem
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
$
八、-r選項: 表示遞歸搜索,不只搜索當前目錄,並且搜索子目錄。
九、-w和-x選項:
-w選項表示匹配整詞,即以模式的字面意思去解析它。
-x選項是匹配整行,即只有當文件中有整行內容與模式匹配時,grep命令才輸出改行結果。
例:說明grep命令的-w和-x選項的區別
$ cat world.txt
Hello World
World
World Cup
African
One One World
$
#搜索包含單詞「World」的文本行
$ grep -w 'World' world.txt
Hello World
World
World Cup
One One World
$
#搜索整行文本是單詞「World」的行
$ grep -x 'World' world.txt
World
&
十、-q選項: 表示grep將再也不輸出任何結果,而是以退出狀態表示搜索是否成功。
0表示成功,1表示未搜索到知足模式的文本行,2表示命令或程序因爲錯誤而未能執行。
例1:grep命令搜索成功
$ grep -q -x 'World' world.txt
$ echo $?
0
$
例2:grep命令未搜索到知足模式的文本行
$ grep -q -x 'World African' world.txt
$ echo $?
1
$
例3:grep命令執行失敗
$ grep -q -x 'World African' world
grep : world : 沒有那個文件或目錄
$ echo $?
2
$
十一、-b和-o選項:
grep -b選項打印匹配行距文件頭部的偏移量,以字節爲單位。
若是在-b選項後面再加上-o選項,grep命令將打印匹配的詞距文件頭部的偏移量。
例1:#第一條命令:打印匹配行距文件頭部的偏移量
$ grep -b -w 'World' world.txt
0:Hello World
12:World
18:World Cup
36:One One World
$
例2:#第一條命令:打印匹配詞距文件頭部的偏移量
$ grep -b -o -w 'World' world.txt
6:World
12:World
18:World
44:World
$
下面介紹一下grep和正則表達式結合使用的例子。
一、匹配行首:
元字符「^」表示行首,若是須要匹配.pem爲後綴的文件中以橫槓「-」開頭的行,可輸入以下命令:
$ grep ^- *.pem
二、設置大小寫:
利用-i符號可使grep命令不區分大小寫,[ ]符號也能夠實現這一功能。
例如:
$ grep -n [Jj][Kk] 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
the jejk ekj44
$
三、匹配重複字符:
能夠用「.」符號和「*」符號來實現。
例1:grep和.符號
#表示搜索00.pem文件中以/字符開始、中間4個任意字符、第6個字符仍爲/的行。
$ grep ^/..../ 00.pem
/home/globus/fff.pem
例2:grep和*符號
#表示搜索00.pem文件中以「-」開頭,重複「-」符號任意次,而後是B字符的行。
$ grep ^-*B 00.pem
----------Bkjfkerj
$
四、轉移符:
若是匹配的目標字符串包含的元字符,則須要用轉義符「\」屏蔽其意義。
例: #搜索「-」符號重複5次的文本行。
$ grep '\-\{5\}' 00.pem
----------Bkjfkerj
frjkj----------Bkltijkert
riuitieoe---erj-----rg
$
五、POSIX字符類:
類名 意義
[:upper:] 表示大寫字母[A-Z]
[:lower:] 表示小寫字母[a-z]
[:digit:] 表示阿拉伯數字[0-9]
[:alnum:] 表示大小寫字母和阿拉伯數字[0-9 a-z A-Z]
[:space:] 表示空格或Tab鍵
[:alpha:] 表示大小寫字母[a-z A-Z]
[:cntrl:] 表示Ctrl鍵
[:graph:][:print:] 表示ASCII碼33-16之間的字符
[:xdigit:] 表示16進制數字[0-9 A-F a-f]
六、精確匹配:
正則表達式中的「\<\>」用於精確匹配。
例子:
$ grep the 00.pem #列出包含the字符串的行
the jskj 'dff
ddfd df the rlt
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
$
$ grep "\<the\>" 00.pem #精確匹配the這個單詞
the jskj 'dff
ddfd df the rlt
the jejk ekj44
$
七、或字符
或字符「|」是擴展的正則表達式中定義的,grep須要加上-E才能支持它。grep -E等價於egrep。
例:搜索00.pem中以冒號「:」或以非英文字母結尾的行。
$ egrep "[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
---------------------------------------------
$ grep -E"[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
----------------------------------------------------------------
grep正則表達式元字符集:
^ 錨定行的開始 如:'^grep'匹配全部以grep開頭的行。
$ 錨定行的結束 如:'grep$'匹配全部以grep結尾的行。
. 匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,而後是p。
* 匹配零個或多個先前字符 如:'*grep'匹配全部一個或多個空格後緊跟grep的行。 .*一塊兒用表明任意字符。
[] 匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
\(..\) 標記匹配字符,如'\(love\)',love被標記爲1。
\ 錨定單詞的開始,如:'\匹配包含以grep開頭的單詞的行。
\> 錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\} 重複字符x,m次,如:'0\{5\}'匹配包含5個o的行。
x\{m,\} 重複字符x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
x\{m,n\}重複字符x,至少m次,很少於n次,如:'o\{5,10\}'匹配5--10個o的行。
\w 匹配文字和數字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字符,而後是p。
\b 單詞鎖定符,如: '\bgrep\b'只匹配grep。
經常使用的 grep 選項有:
-c 只輸出匹配行的個數。
-i 不區分大小寫(只適用於單字符)。
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-n 顯示匹配行及行號。
-s 不顯示不存在或無匹配文本的錯誤信息。
-v 顯示不包含匹配文本的全部行。
-V 顯示軟件版本信息
使用grep匹配時最好用雙引號引發來,防止被系統誤認爲參數或者特殊命令,也能夠匹配多個單詞。
關於匹配的實例:
grep -c "48" test.txt 統計全部以「48」字符開頭的行有多少
grep -i "May" test.txt 不區分大小寫查找「May」全部的行)
grep -n "48" test.txt 顯示行號;顯示匹配字符「48」的行及行號,相同於 nl test.txt |grep 48)
grep -v "48" test.txt 顯示輸出沒有字符「48」全部的行)
grep "471" test.txt 顯示輸出字符「471」所在的行)
grep "48;" test.txt 顯示輸出以字符「48」開頭,並在字符「48」後是一個tab鍵所在的行
grep "48[34]" test.txt 顯示輸出以字符「48」開頭,第三個字符是「3」或是「4」的全部的行)
grep "^[^48]" test.txt 顯示輸出行首不是字符「48」的行)
grep "[Mm]ay" test.txt 設置大小寫查找:顯示輸出第一個字符以「M」或「m」開頭,以字符「ay」結束的行)
grep "K…D" test.txt 顯示輸出第一個字符是「K」,第2、3、四是任意字符,第五個字符是「D」所在的行)
grep "[A-Z][9]D" test.txt 顯示輸出第一個字符的範圍是「A-D」,第二個字符是「9」,第三個字符的是「D」的全部的行
grep "[35]..1998" test.txt 顯示第一個字符是3或5,第二三個字符是任意,以1998結尾的全部行
grep "4\{2,\}" test.txt 模式出現概率查找:顯示輸出字符「4」至少重複出現兩次的全部行
grep "9\{3,\}" test.txt 模式出現概率查找:顯示輸出字符「9」至少重複出現三次的全部行
grep "9\{2,3\}" test.txt 模式出現概率查找:顯示輸出字符「9」重複出現的次數在必定範圍內,重複出現2次或3次全部行
grep -n "^$" test.txt 顯示輸出空行的行號
ls -l |grep "^d" 若是要查詢目錄列表中的目錄 同:ls -d *
ls -l |grep "^d[d]" 在一個目錄中查詢不包含目錄的全部文件
ls -l |grpe "^d…..x..x" 查詢其餘用戶和用戶組成員有可執行權限的目錄集合
分類: Linux 2010-05-01 15:55 21458人閱讀
首先要記住的是: 正則表達式與通配符不同,它們表示的含義並不相同!
正則表達式只是一種表示法,只要工具支持這種表示法, 那麼該工具就能夠處理正則表達式的字符串。vim、grep、awk 、sed 都支持正則表達式,也正是由於因爲它們支持正則,才顯得它們強大;
1基礎正則表達式
grep 工具,之前介紹過。
grep -[acinv] '搜索內容串' filename
-a 以文本文件方式搜索
-c 計算找到的符合行的次數
-i 忽略大小寫
-n 順便輸出行號
-v 反向選擇,即顯示不包含匹配文本的全部行
-h 查詢多文件時不顯示文件名。
-l 查詢多文件時只輸出包含匹配字符的文件名。
-s 不顯示不存在或無匹配文本的錯誤信息。
grep命令加- E參數,這一擴展容許使用擴展模式匹配。
其中搜索串能夠是正則表達式!
---
先用例子說明問題:
如下爲整理的grep 正則表達式的大部分功能,詳細參見man
grep: 要用好grep這個工具,其實就是要寫好正則表達式,因此這裏不對grep的全部功能進行實例講解,只列幾個例子,講解一個正則表達式的寫法。
$ ls -l | grep '^a' 經過管道過濾ls -l輸出的內容,只顯示以a開頭的行。
$ grep 'test' d* 顯示全部以d開頭的文件中包含test的行。
$ grep 'test' aa bb cc 顯示在aa,bb,cc文件中匹配test的行。
$ grep '[a-z]/{5/}' aa 顯示全部包含每一個字符串至少有5個連續小寫字符的字符串的行。
$ grep 'w/(es/)t.*/1' aa 若是west被匹配,則es就被存儲到內存中,並標記爲1,而後搜索任意個字符(.*),這些字符後面緊跟着另一個es(/1),找到就顯示該行。若是用egrep或grep -E,就不用"/"號進行轉義,直接寫成'w(es)t.*/1'就能夠了。
grep正則表達式元字符集(基本集)
^ 錨定行的開始 如:'^grep'匹配全部以grep開頭的行。
$ 錨定行的結束 如:'grep$'匹配全部以grep結尾的行。
. 匹配一個非換行符的字符 如:'gr.p'匹配gr後接一個任意字符,而後是p。
* 匹配零個或多個先前字符 如:'*grep'匹配全部一個或多個空格後緊跟grep的行。
.*一塊兒用表明任意字符。
[] 匹配一個指定範圍內的字符,如'[Gg]rep'匹配Grep和grep。
[^] 匹配一個不在指定範圍內的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一個字母開頭,緊跟rep的行。
/(../) 標記匹配字符,如'/(love/)',love被標記爲1。
/< 錨定單詞的開始,
/> 錨定單詞的結束,如'grep/>'匹配包含以grep結尾的單詞的行。
x/{m/} 重複字符x,m次,如:'o/{5/}'匹配包含5個o的行。 x/{m,/} 重複字符x,至少m次,如:'o/{5,/}'匹配至少有5個o的行。
x/{m,n/} 重複字符x,至少m次,很少於n次,如:'o/{5,10/}'匹配5--10個o的行。
/w 匹配文字和數字字符,也就是[A-Za-z0-9_],如:'G/w*p'匹配以G後跟零個或多個文字或數字字符,而後是p。
/W /w的反置形式,匹配一個或多個非單詞字符,如點號句號等。
/b 單詞鎖定符,如: '/bgrep/b'只匹配grep。
關於匹配的實例:
grep -c "48" test.txt 統計全部以「48」字符開頭的行有多少
grep -i "May" test.txt 不區分大小寫查找「May」全部的行)
grep -n "48" test.txt 顯示行號;顯示匹配字符「48」的行及行號,相同於 nl test.txt |grep 48)
grep -v "48" test.txt 顯示輸出沒有字符「48」全部的行)
grep "471" test.txt 顯示輸出字符「471」所在的行)
grep "48;" test.txt 顯示輸出以字符「48」開頭,並在字符「48」後是一個tab鍵所在的行
grep "48[34]" test.txt 顯示輸出以字符「48」開頭,第三個字符是「3」或是「4」的全部的行)
grep "^[^48]" test.txt 顯示輸出行首不是字符「48」的行)
grep "[Mm]ay" test.txt 設置大小寫查找:顯示輸出第一個字符以「M」或「m」開頭,以字符「ay」結束的行)
grep "K…D" test.txt 顯示輸出第一個字符是「K」,第2、3、四是任意字符,第五個字符是「D」所在的行)
grep "[A-Z][9]D" test.txt 顯示輸出第一個字符的範圍是「A-D」,第二個字符是「9」,第三個字符的是「D」的全部的行
grep "[35]..1998" test.txt 顯示第一個字符是3或5,第二三個字符是任意,以1998結尾的全部行
grep "4/{2,/}" test.txt 模式出現概率查找:顯示輸出字符「4」至少重複出現兩次的全部行
grep "9/{3,/}" test.txt 模式出現概率查找:顯示輸出字符「9」至少重複出現三次的全部行
grep "9/{2,3/}" test.txt 模式出現概率查找:顯示輸出字符「9」重複出現的次數在必定範圍內,重複出現2次或3次全部行
grep -n "^$" test.txt 顯示輸出空行的行號
ls -l |grep "^d" 若是要查詢目錄列表中的目錄 同:ls -d *
ls -l |grep "^d[d]" 在一個目錄中查詢不包含目錄的全部文件
ls -l |grpe "^d…..x..x" 查詢其餘用戶和用戶組成員有可執行權限的目錄集合
更多的例子:
1
搜索有the的行,並輸出行號
$grep -n 'the' regular_express.txt
搜 索沒有the的行,並輸出行號
$grep -nv 'the' regular_express.txt
2 利 用[]搜索集合字符
[] 表示其中的某一個字符 ,例如[ade] 表示a或d或e
woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt
8:I can't finish the test.
9:Oh! the soup taste good!
能夠用^符號作[]內的前綴,表示除[]內的字符以外的字 符。
好比搜索oo前沒有g的字符串所在的行. 使用 '[^g]oo' 做搜索字符串
woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt
2:apple is my favorite food.
3:Football game is not use feet only.
18:google is the best tools for search keyword.
19:goooooogle yes!
[] 內能夠用範圍表示,好比[a-z] 表示小寫字母,[0-9] 表示0~9的數字, [A-Z] 則是大寫字母們。[a-zA-Z0-9]表示全部數字與英文字符。 固然也能夠配合^來排除字符。
搜索包含數字的行
woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt
5:However ,this dress is about $ 3183 dollars.
15:You are the best is menu you are the no.1.
行首與行尾字符 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字符,是位置)那麼‘^$’ 就表示空行,由於只有
行首和行尾。
這裏^與[]裏面使用的^意義不一樣。它表示^後面的串是在行的開頭。
好比搜索the在開頭的行
woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt
12:the symbol '*' is represented as star.
搜索以小寫字母開頭的行
woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt
2:apple is my favorite food.
4:this dress doesn't fit me.
10:motorcycle is cheap than car.
12:the symbol '*' is represented as star.
18:google is the best tools for search keyword.
19:goooooogle yes!
20:go! go! Let's go.
woody@xiaoc:~/tmp$
搜索開頭不是英文字母的行
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
21:#I am VBird
woody@xiaoc:~/tmp$
$表示它前面的串是在行的結尾,好比 '/.' 表示 . 在一行的結尾
搜索末尾是.的行
woody@xiaoc:~/tmp$ grep -n '/.$' regular_express.txt //. 是正則表達式的特殊符號,因此要用/轉義
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
5:However ,this dress is about $ 3183 dollars.
6:GNU is free air not free beer.
.....
注意在MS的系統下生成的文本文件,換行會加上一個 ^M 字符。因此最後的字符會是隱藏的^M ,在處理Windows
下面的文本時要特別注意!
能夠用cat dos_file | tr -d '/r' > unix_file 來刪除^M符號。 ^M==/r
那麼'^$' 就表示只有行首行尾的空行拉!
搜索空行
woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt
22:
23:
woody@xiaoc:~/tmp$
搜索非空行
woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt
1:"Open Source" is a good mechanism to develop programs.
2:apple is my favorite food.
3:Football game is not use feet only.
4:this dress doesn't fit me.
http://my.unix-center.net/~Simon_fu/?p=469
雖然正則表達式常常都在用,可是不多可以靜下心來仔細的總結一下。最近看了一個臺灣人的網站叫作鳥哥Linux私房菜,關於正則表達式的描述挺詳細的。在此,我進行一下總結,若是想仔細的學習正則表達式,請訪問鳥哥Linux私房菜,臺灣同胞的網站是繁體中文的,須要點兒耐心。
正則表達式只是字符串的一種描述,只有和支持正則表達式的工具相結合才能進行字符串處理。本文以grep爲例來說解正則表達式。
grep命令
功能:輸入文件的每一行中查找字符串。
基本用法:
–color選項是個很是好的選項,可讓你清楚的明白匹配了那些字符。最好在本身的.bashrc或者.bash_profile文件中加入:
每次grep搜索以後,自動高亮匹配效果了。
‘搜尋字符串’是正則表達式,注意爲了不shell的元字符對正則表達式的影響,請用單引號(’’)括起來,千萬不要用雙引號括起來("」)或者不括起來。
正則表達式分爲基本正則表達式和擴展正則表達式。下面分別簡單總結一下。
基本正則表達式
正則表達式學習,主要是對正則表達式元數據的學習。正則表達式自己沒有什麼高深的東西,本文僅僅對基本正則表達式的元數據進行一下總結:
元數據 |
意義和範例 |
^word |
搜尋以word開頭的行。 例如:搜尋以#開頭的腳本註釋行 grep –n ‘^#’ regular.txt |
word$ |
搜尋以word結束的行 例如,搜尋以‘.’結束的行 grep –n ‘.$’ regular.txt |
. |
匹配任意一個字符。 例如:grep –n ‘e.e’ regular.txt 匹配e和e之間有任意一個字符,能夠匹配eee,eae,eve,可是不匹配ee。 |
\ |
轉義字符。 例如:搜尋’,’是一個特殊字符,在正則表達式中有特殊含義。必需要先轉義。 grep –n ‘\」 regular.txt |
* |
前面的字符重複0到屢次。 例如匹配gle,gogle,google,gooogle等等 grep –n ‘go*gle’ regular.txt |
[list] |
匹配一系列字符中的一個。 例如:匹配gl,gf。 grep –n ‘g[lf]’ regular.txt |
[n1-n2] |
匹配一個字符範圍中的一個字符。 例如:匹配數字字符 grep –n ‘[0-9]’ regular.txt |
[^list] |
匹配字符集之外的字符 例如:grep –n ‘[^o]‘ regular.txt 匹配非o字符 |
\{n1,n2\} |
前面的字符重複n1,n2次 例如:匹配google,gooogle。 grep –n ‘go\{2,3\}gle’ regular.txt |
\<word |
單詞是的開頭。 例如:匹配以g開頭的單詞 grep –n ‘\<g’ regular.txt |
word\> |
匹配單詞結尾 例如:匹配以tion結尾的單詞 grep –n ‘tion\>’ regular.txt |
擴展正則表達式
grep通常狀況下支持基本正則表達式,能夠經過參數-E支持擴展正則表達式,另外grep單獨提供了一個擴展命令叫作egrep用來支持擴展正則表達 式,這條命令和grep -E等價。雖然通常狀況下,基本正則表達式就夠用了。特殊狀況下,複雜的擴展表達式,能夠簡化字符串的匹配。
擴展正則表達式就是在基本正則表達式的基礎上,增長了一些元數據。
元數據 |
意義和範例 |
+ |
重複前面字符1到屢次。 例如:匹配god,good,goood等等字符串。 grep –nE go+d’ regular.txt |
? |
匹配0或1次前面的字符 例如,匹配gd,god grep –nE ‘go?d’ regular.txt |
| |
或(or)的方式匹配多個字串 例如:grep –nE ‘god|good’ regular.txt 匹配god或者good。 |
() |
匹配整個括號內的字符串,原來都是匹配單個字符 例如:搜尋good或者glad grep –nE ‘g(oo|la)’ regular.txt |
() |
前面的字符重複0到屢次。 例如匹配gle,gogle,google,gooogle等等 grep –nE ‘go*gle’ regular.txt |
Linux下面正則表達式博大精深,上文支持總結了最經常使用的部分,若是熟練掌握的上面部分的正則表達式基本上能夠知足平常使用了。
另外Linux不少命令支持正則表達式,好比find,sed,awk等等。請在使用的時候參照這些命令的手冊使用正則表達式。
grep用法詳解 grep與正則表達式
做者: 字體:[
增長
減少] 類型:轉載 時間:2012-09-05
首先要記住的是: 正則表達式與通配符不同,它們表示的含義並不相同!
正則表達式只是一種表示法,只要工具支持這種表示法, 那麼該工具就能夠處理正則表達式的字符串。vim、grep、awk 、sed 都支持正則表達式,也正是由於因爲它們支持正則,才顯得它們強大;在之前上班的公司裏,因爲公司是基於web的服務型網站(nginx),對正則的需求比 較大,因此也花了點時間研究正則,特與你們分享下: 1基礎正則表達式 grep 工具,之前介紹過。 grep -[acinv] '搜索內容串' filename -a 以文本文件方式搜索 -c 計算找到的符合行的次數 -i 忽略大小寫 -n 順便輸出行號 -v 反向選擇,即找 沒有搜索字符串的行 其中搜索串能夠是正則表達式! 1 搜索有the的行,並輸出行號 $grep -n 'the' regular_express.txt 搜 索沒有the的行,並輸出行號 $grep -nv 'the' regular_express.txt 2 利 用[]搜索集合字符 [] 表示其中的某一個字符 ,例如[ade] 表示a或d或e woody@xiaoc:~/tmp$ grep -n 't[ae]st' regular_express.txt 8:I can't finish the test. 9:Oh! the soup taste good! 能夠用^符號作[]內的前綴,表示除[]內的字符以外的字 符。 好比搜索oo前沒有g的字符串所在的行. 使用 '[^g]oo' 做搜索字符串 woody@xiaoc:~/tmp$ grep -n '[^g]oo' regular_express.txt 2:apple is my favorite food. 3:Football game is not use feet only. 18:google is the best tools for search keyword. 19:goooooogle yes! [] 內能夠用範圍表示,好比[a-z] 表示小寫字母,[0-9] 表示0~9的數字, [A-Z] 則是大寫字母們。[a-zA-Z0-9]表示全部數字與英文字符。 固然也能夠配合^來排除字符。 搜索包含數字的行 woody@xiaoc:~/tmp$ grep -n '[0-9]' regular_express.txt 5:However ,this dress is about $ 3183 dollars. 15:You are the best is menu you are the no.1. 行首與行尾字符 ^ $. ^ 表示行的開頭,$表示行的結尾( 不是字符,是位置)那麼‘^$' 就表示空行,由於只有 行首和行尾。 這裏^與[]裏面使用的^意義不一樣。它表示^後面的串是在行的開頭。 好比搜索the在開頭的行 woody@xiaoc:~/tmp$ grep -n '^the' regular_express.txt 12:the symbol '*' is represented as star. 搜索以小寫字母開頭的行 woody@xiaoc:~/tmp$ grep -n '^[a-z]' regular_express.txt 2:apple is my favorite food. 4:this dress doesn't fit me. 10:motorcycle is cheap than car. 12:the symbol '*' is represented as star. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go. woody@xiaoc:~/tmp$ 搜索開頭不是英文字母的行 woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 21:#I am VBird woody@xiaoc:~/tmp$ $表示它前面的串是在行的結尾,好比 '\.' 表示 . 在一行的結尾 搜索末尾是.的行 woody@xiaoc:~/tmp$ grep -n '\.$' regular_express.txt //. 是正則表達式的特殊符號,因此要用\轉義 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 4:this dress doesn't fit me. 5:However ,this dress is about $ 3183 dollars. 6:GNU is free air not free beer. ..... 注意在MS的系統下生成的文本文件,換行會加上一個 ^M 字符。因此最後的字符會是隱藏的^M ,在處理Windows 下面的文本時要特別注意! 能夠用cat dos_file | tr -d '\r' > unix_file 來刪除^M符號。 ^M==\r 那麼'^$' 就表示只有行首行尾的空行拉! 搜索空行 woody@xiaoc:~/tmp$ grep -n '^$' regular_express.txt 22: 23: woody@xiaoc:~/tmp$ 搜索非空行 woody@xiaoc:~/tmp$ grep -vn '^$' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 4:this dress doesn't fit me. .......... 任意一個字符. 與重複字符 * 在bash中*表明通配符,用來表明任意個 字符,可是在正則表達式中,他含義不一樣,*表示有0個或多個 某個字符。 例如 oo*, 表示第一個o必定存在,第二個o能夠有一個或多個,也能夠沒有,所以表明至少一個o. 點. 表明一個任意字符,必須存在。 g??d 能夠用 'g..d' 表示。 good ,gxxd ,gabd .....都符合。 woody@xiaoc:~/tmp$ grep -n 'g..d' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 9:Oh! the soup taste good! 16:The world is the same with 'glad'. woody@xiaoc:~/tmp$ 搜索兩個o以上的字符串 woody@xiaoc:~/tmp$ grep -n 'ooo*' regular_express.txt //前兩個o必定存在,第三個o可沒有,也可有多個。 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! the soup taste good! 18:google is the best tools for search keyword. 19:goooooogle yes! 搜索g開頭和結尾,中間是至少一個o的字符串,即gog, goog....gooog...等 woody@xiaoc:~/tmp$ grep -n 'goo*g' regular_express.txt 18:google is the best tools for search keyword. 19:goooooogle yes! 搜索g開頭和結尾的字符串在的行 woody@xiaoc:~/tmp$ grep -n 'g.*g' regular_express.txt // .*表示 0個或多個任意字符 1:"Open Source" is a good mechanism to develop programs. 14:The gd software is a library for drafting programs. 18:google is the best tools for search keyword. 19:goooooogle yes! 20:go! go! Let's go. 限定連續重複字符的範圍 { } . * 只能限制0個或多個, 若是要確切的限制字符重複數量,就用{範圍} 。範圍是數字用,隔開 2,5 表示2~5個, 2表示2個,2, 表示2到更多個 注意,因爲{ }在SHELL中有特殊意義,所以做爲正則表達式用的時候要用\轉義一下。 搜索包含兩個o的字符串的行。 woody@xiaoc:~/tmp$ grep -n 'o\{2\}' regular_express.txt 1:"Open Source" is a good mechanism to develop programs. 2:apple is my favorite food. 3:Football game is not use feet only. 9:Oh! the soup taste good! 18:google is the best tools for search keyword. 19:goooooogle yes! 搜索g後面跟2~5個o,後面再跟一個g的字符串的行。 woody@xiaoc:~/tmp$ grep -n 'go\{2,5\}g' regular_express.txt 18:google is the best tools for search keyword. 搜索包含g後面跟2個以上o,後面再跟g的行。。 woody@xiaoc:~/tmp$ grep -n 'go\{2,\}g' regular_express.txt 18:google is the best tools for search keyword. 19:goooooogle yes! 注意,相讓[]中的^ - 不表現特殊意義,能夠放在[]裏面內容的後面。 '[^a-z\.!^ -]' 表示沒有小寫字母,沒有. 沒有!, 沒有空格,沒有- 的 串,注意[]裏面有個小空格。 另外shell 裏面的反向選擇爲[!range], 正則裏面是 [^range] 2擴展正則表達式 擴展正則表達式是對基礎正則表達式添加了幾個特殊構成的。 它令某些操做更加方便。 好比咱們要去除 空白行和行首爲 #的行, 會這樣用: woody@xiaoc:~/tmp$ grep -v '^$' regular_express.txt | grep -v '^#' "Open Source" is a good mechanism to develop programs. apple is my favorite food. Football game is not use feet only. this dress doesn't fit me. ............ 然而使用支持擴展正則表達式的 egrep 與擴展特殊符號 | ,會方便許多。 注意grep只支持基礎表達式, 而egrep 支持擴展的, 其實 egrep 是 grep -E 的別名而已。所以grep -E 支持擴展正則。 那麼: woody@xiaoc:~/tmp$ egrep -v '^$|^#' regular_express.txt "Open Source" is a good mechanism to develop programs. apple is my favorite food. Football game is not use feet only. this dress doesn't fit me. .................... 這裏| 表示或的關係。 即知足 ^$ 或者 ^# 的字符串。 這裏列出幾個擴展特殊符號: +, 於 . * 做用相似,表示 一個或多個重複字符。 ?, 於 . * 做用相似,表示0個或一個字符。 |,表示或關係,好比 'gd|good|dog' 表示有gd,good或dog的串 (),將部份內容合成一個單元組。 好比 要搜索 glad 或 good 能夠這樣 'g(la|oo)d' ()的好處是能夠對小組使用 + ? * 等。 好比要搜索A和C開頭結尾,中間有至少一個(xyz) 的串,能夠這樣 : 'A(xyz)+C'