posts - 8,  comments - 6,  trackbacks - 0

          一、            正則表達(dá)式:

           

          正則表達(dá)式(或稱Regular Expression,簡(jiǎn)稱RE)就是由普通字符(例如字符 a  z)以及特殊字符(稱為元字符)組成的文字模式。

           

          該模式描述在查找文字主體時(shí)待匹配的一個(gè)或多個(gè)字符串。

           

          正則表達(dá)式作為一個(gè)模板,將某個(gè)字符模式與所搜索的字符串進(jìn)行匹配。簡(jiǎn)單的說,正則表示式就是處理字符串的方法,它是以行為單位來進(jìn)行字符串的處理行為, 正則表示式通過一些特殊符號(hào)的輔助,可以讓使用者輕易的達(dá)到搜尋/刪除/取代某特定字符串的處理程序。vimgrepfindawksed等命令都支持正則表達(dá)式。

          常用正則表達(dá)式:

          1.代表任意單個(gè)字符,如:/l..e/與包含一個(gè)l,后跟兩個(gè)字符,然后跟一個(gè)e的行相匹配

                   grep l..e test

                   awk /l..e/ test

           

                   cat  test查看文件

                             leeet

                             laat

                             lae

          2^代表行的開始。 ^love 與所有love開頭的行匹配

                   grep ^le test

          3$代表行的結(jié)束。love$ 與所有love結(jié)尾的行匹配

          那么‘^$’ 就表示空行

          grep  at$ test

          4[]匹配括號(hào)中的字符之一

          [abc]     匹配單個(gè)字符abc

          [123]     匹配單個(gè)字符123

          [a-z]     匹配小寫字母a-z之一

          [a-zA-Z]    匹配任意英文字母之一

          [0-9a-zA-Z]匹配任意英文字母或數(shù)字之一

          注意:上面標(biāo)紅色的單個(gè)和之一,不管[]里面多復(fù)雜,它的結(jié)果都是一個(gè)字符!

                   grep l[ae]e test

                   awk/l[ae]e/ test

           

          可以用^標(biāo)記做[]內(nèi)的前綴,表示[]內(nèi)的字符之外的字符。比如 搜索oo前沒有g的字符串的行應(yīng)用 '[^g]oo'作搜索字符串,^符號(hào)如果出現(xiàn)[]的起始位置表示否定,但是[]的其他位置是普通字符[^9b^c] 匹配b^c不是a的任意單個(gè)字符

           

          5、* 用于修飾前導(dǎo)字符,表示前導(dǎo)字符出現(xiàn)0或任意多

          如:'a*grep'匹配所有0個(gè)或多個(gè)a后緊跟grep的行。.*”表示任意字符串

           

          6\?用于修飾前導(dǎo)字符,表示前導(dǎo)字符出現(xiàn)0或1

          a\? 匹配0或1個(gè)a

           

          7\+用于修飾前導(dǎo)字符,表示前導(dǎo)字符出現(xiàn)1或多

          a\+ 匹配1或多個(gè)a

           

          8\{n,m\} 用于修飾前導(dǎo)字符,表示前導(dǎo)字符出現(xiàn)n至m次(n和m都是整數(shù),且n<m)

          a\{3,5\} 匹配3至5個(gè)連續(xù)的a

           

          \{n,m\}還有其他幾種形式:

          \{n\} 連續(xù)的n個(gè)前導(dǎo)字符

          \{n,\} 連續(xù)的至少n個(gè)前導(dǎo)字符

          9、\ 用于轉(zhuǎn)義緊跟其后的單個(gè)特殊字符,使該特殊字符成為普通字符

           

          如:^\.[0-9][0-9] 對(duì)以一個(gè)句點(diǎn)和兩個(gè)數(shù)字開始

           

          例如:

          a* 匹配連續(xù)的任意(也包括0)個(gè)a

          a\? 匹配0或1個(gè)a

          a\+ 匹配1或多個(gè)a

          a\{3,5\} 匹配3至5個(gè)連續(xù)的a

          \.* 匹配0或多個(gè)連續(xù)的.  \.表示普通字符句點(diǎn)

           

          sed s/^ *[0-9]*// test1

          history > test1(先生成test1文件)

          10|表示  如:a|b|c 匹配abc。如:grep|sed匹配grepsed

              如:egrep  grep|sed test

          11(),將部分內(nèi)容合成一個(gè)單位組,比如要搜索 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的一個(gè)字母開頭,然后跟兩個(gè)任意字母,然后跟一個(gè)換行符的行。將找到第5行。

           

          ^[A-Z][a-z]*3[0-5]

          搜索以一個(gè)大寫字母開頭,后跟0個(gè)或多個(gè)小寫字母,再跟數(shù)字3,再跟05之間的一個(gè)數(shù)字。無法找到匹配行(改成^[A-Z][a-z]*.*3[0-5]可找到第2行)

           

          ^ *[A-Z][a-z][a-z]$

          搜索以0個(gè)或多個(gè)空格開頭,跟一個(gè)大寫字母,兩個(gè)小寫字母和一個(gè)換車符。將找到第4行的TOM(整行匹配)和第5行。注意,*前面有一個(gè)空格

           

           

          綜合舉例2:

          # ls -l  /bin | grep  '^...s'

          上面的命令是用來查找suid文件的;

          # ls -lR /usr |grep   '^...s..s'

          上面的命令是用來查找suid和guid的。

           

          二、grep命令的用法

          grep global search regularexpression(RE) and print out the line,全面搜索正則表達(dá)式并把行打印出來)是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來.

           

          參數(shù):

          1. -A NUM--after-context=NUM   除了列出符合行之外,并且列出后NUM行。

          :   $ grep –A 1 panda file  (file中搜尋有panda樣式的行,并顯示該行的后1)

           

          2. -B NUM--before-context=NUM   -A NUM 相對(duì),但這此參數(shù)是顯示除符合行之外并顯示在它之前的NUM行。如:    (file中搜尋有panda樣式的行,并顯示該行的前1)

          $ grep -B 1 panda file

           

          3 -C [NUM], -NUM, --context[=NUM]  列出符合行之外并列出上下各NUM行,默認(rèn)值是2

           

          :    (列出file中除包含panda樣式的行外并列出其上下2)(若要改變默認(rèn)值,直接改變NUM即可)

          $ grep -C[NUM] panda file

           

          4 -c, --count  不顯示符合樣式行,只顯示符合的總行數(shù)。若再加上-v,--invert-match,參數(shù)顯示不符合的總行數(shù)

          5-i--ignore-case 忽略大小寫差別

           

          6-n--line-number 在匹配的行前面打印行號(hào)

           

          7-v--revert-match  反檢索,只顯示不匹配的行

           

          8、精確匹配:

          例如在抽取字符串“ 48”,返回結(jié)果包含諸如484和483等包含“48”的其他字符串,實(shí)際上應(yīng)精確抽取只包含48的各行。

           

          使用grep抽取精確匹配的一種有效方式是在抽取字符串前加\<,在抽取字符串后加\>。假定現(xiàn)在精確抽取48,

          方法如下:

          #grep '\<48\>' filename

           

          9、-s 不顯示不存在或無匹配文本的錯(cuò)誤信息

          如:執(zhí)行命令grep "root" /etc/password,因?yàn)閜assword文件不存在,所以在屏幕上輸出錯(cuò)誤信息,若使用grep命令-s開關(guān),可屏蔽錯(cuò)誤信息

           

          要用好grep這個(gè)工具,其實(shí)就是要寫好正則表達(dá)式,所以這里不對(duì)grep的所有功能進(jìn)行實(shí)例講解,只列幾個(gè)例子,講解一個(gè)正則表達(dá)式的寫法。

           

          $ ls -l | grep  '^d' 
          通過管道過濾ls-l輸出的內(nèi)容,只顯示以d開頭的行。

           

          $ grep  'test' d* 
          顯示所有以d開頭的文件中包含test的行。

           

          $ grep  'test' aa  bb  cc 
          顯示在aabbcc文件中匹配test的行。

           

          $ grep  '[a-z]\{5,\}' aa 
          顯示所有包含每個(gè)字符串至少有5個(gè)連續(xù)小寫字符的字符串的行。

           

          $grep  ‘t[a|e]st’ filename

          顯示包含testtast的所有行。

           

          $grep  '\.$' filename

          顯示以.為結(jié)尾的所有行。

           

          三、sed命令的用法

          sed是一種在線編輯器,它一次處理一行內(nèi)容。處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū)中,稱為模式空間pattern space),接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理完成后,把緩沖區(qū)的內(nèi)容送往屏幕。接著處理下一行,這樣不斷重復(fù),直到文件末尾。文件內(nèi)容并沒有改變,除非你使用重定向存儲(chǔ)輸出。

           

          sed的基本命令

          1替換: s命令
                  1.1 基本用法

            如: sed 's/day/night/' <old >new
            該例子將文件 old 中的每一行第一次出現(xiàn)的 day 替換成 night, 將結(jié)果輸出到文件 new

           

           s            " 替換 " 命令 
            /../../      分割符 (Delimiter)
            day          搜索字符串 
            night        替換字符串 
            其實(shí) , 分割符 "/" 可以用別的符號(hào)代替 , 比如 ",","|"  .
           如:sed's/\/usr\/local\/bin/\/common\/bin/'<old >new
            等價(jià)于 sed's_/usr/local/bin_/common/bin_' <old >new
            顯然 , 此時(shí)用 "_" 作分割符比 "/" 好得多

           sed -i 's/anonymous=YES/anonymous=NO/'  /etc/vsftpd/vsftpd.conf

          1.2  & 表示匹配的字符串

          有時(shí)可能會(huì)想在匹配到的字符串周圍或附近加上一些字符 .
           如: sed 's/abc/(abc)/' <old >new

           

           該例子在找到的 abc 前后加上括號(hào) .
           該例子還可以寫成 sed 's/abc/(&)/' <old >new

           

           下面是更復(fù)雜的例子 :
           sed 's/[a-z]*/(&)/' <old >new

           

          sed 默認(rèn)只替換搜索字符串的第一次出現(xiàn) , 利用 /g 可以替換搜索字符串所有

          $ sed's/test/mytest/g' example-----在整行范圍內(nèi)把test替換為mytest。如果沒有g標(biāo)記,則只有每行第一個(gè)匹配的test被替換成mytest

          $ sed's/^192.168.0.1/&localhost/' example-----&符號(hào)表示替換字符串中被找到的部份。所有以192.168.0.1開頭的行都會(huì)被替換成它自已加 localhost,變成192.168.0.1localhost

          $ sed's#10#100#g' example-----不論什么字符,緊跟著s命令的都被認(rèn)為是新的分隔符,所以,“#”在這里是分隔符,代替了默認(rèn)的“/”分隔符。表示把所有10替換成100

          如果需要對(duì)同一文件或行作多次修改,可以使用 "-e" 選項(xiàng)

          spacer.gif

          取得eth0網(wǎng)卡IP地址:

          spacer.gif

           

          2.刪除行:d命令

          從某文件中刪除包含 "how" 的所有行

          spacer.gif

           

          /etc/passwd的內(nèi)容顯示并找印行號(hào),同時(shí)將2~5刪除

          spacer.gif

           

          附:nl命令在linux系統(tǒng)中用來計(jì)算文件中行號(hào)nl 可以將輸出的文件內(nèi)容自動(dòng)的加上行號(hào)

          如果只要?jiǎng)h除第2行,可以使用nl /etc/passwd | sed '2d' 來達(dá)成,至于若是要?jiǎng)h除第 3 到最后一行,則是nl /etc/passwd | sed '3,$d'的啦。

           

          3.增加行:a命令(在指定的行后新增)或i命令(在指定的行前新增)

          a的后面可以接字符串,而這些字符串會(huì)在新的一行出現(xiàn)

          /etc/passwd的第二行后增加“XXXXX”字樣的新行

          spacer.gif

           

          /etc/passwd的第二行前增加“XXXXX”字樣的新行

          spacer.gif

           

          如果要同時(shí)新增多行,則每行之間要用反斜杠\來進(jìn)行新行的添加

          spacer.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

           

          5、打印:p命令

          sed '/north/p' datafile 默認(rèn)輸出所有行,找到north的行重復(fù)打印

           

          sed  –n '/north/p' datafile 禁止默認(rèn)輸出,只打印找到north的行

           

          nl /etc/passwd | sed -n '5,7p' 僅列出/etc/passwd文件中的第57行內(nèi)容

           

          注:sed -i選項(xiàng)可以直接修改文件中的內(nèi)容

          spacer.gif

          四、awk命令:

          awk也是一個(gè)數(shù)據(jù)處理工具!相較于 sed 常常作用于一整個(gè)行的處理, awk 則比較傾向于一行當(dāng)中分成數(shù)個(gè)字段來處理。

           

          .awk語言的最基本功能是在文件或字符串中基于指定規(guī)則來分解抽取信息,也可以基于指定的規(guī)則來輸出數(shù)據(jù)。

           

          1.命令格式

          awk  [-F field-separator]  'commands' input-files

          其中,[-F域分隔符]是可選的,因?yàn)?/span>awk使用空格或tab鍵作為缺省的域分隔符,因此如果要瀏覽域間有空格的文本,不必指定這個(gè)選項(xiàng),如果要瀏覽諸如passwd文件,此文件各域以冒號(hào)作為分隔符,則必須指明-F選項(xiàng),如:awk -F: 'commands' input-file

           

          awk的模式和動(dòng)作

           

          任何awk語句都由模式和動(dòng)作組成(awk_pattern { actions })。
          在一個(gè)awk腳本中可能有許多語句。

          模式部分決定動(dòng)作語句何時(shí)觸發(fā)及觸發(fā)事件。處理即對(duì)數(shù)據(jù)進(jìn)行的操作。如果省略模式部分,動(dòng)作將時(shí)刻保持執(zhí)行狀態(tài)。即省略時(shí)不對(duì)輸入記錄進(jìn)行匹配比較就執(zhí)行相應(yīng)的actions。

           

          模式可以是任何條件語句或正則表達(dá)式等。awk_pattern可以是以下幾種類型:

           

          1) 正則表達(dá)式用作awk_pattern: /regexp/

          例如:awk '/ ^[a-z]/' input_file

          2) 布爾表達(dá)式用作awk_pattern,表達(dá)式成立時(shí),觸發(fā)相應(yīng)的actions執(zhí)行。

           表達(dá)式中可以使用變量(如字段變量$1,$2等)和/regexp/

          ② 布爾表達(dá)式中的操作符:

           

          關(guān)系操作符: < > <= >= == !=
          匹配操作符: value ~ /regexp/ 如果value匹配/regexp/,則返回真

          value !~ /regexp/ 如果value不匹配/regexp/,則返回真
          例如: awk '$2 > 10 {print"ok"}' input_file
                awk '$3 ~ /^d/ {print"ok"}' input_file

          ③ &&(與)和 ||(或) 可以連接兩個(gè)/regexp/或者布爾表達(dá)式,構(gòu)成混合表達(dá)式。!(非) 可以用于布爾表達(dá)式或者/regexp/之前。

           

          例如: awk '($1 < 10 ) && ($2> 10) {print "ok"}' input_file
                awk '/^d/ || /x$/ {print"ok"}' input_file

          模式包括兩個(gè)特殊字段 BEGINEND。使用BEGIN語句設(shè)置計(jì)數(shù)和打印頭。BEGIN語句使用在任何文本瀏覽動(dòng)作之前,之后文本瀏覽動(dòng)作依據(jù)輸入文本開始執(zhí)行。END語句用來在awk完成文本瀏覽動(dòng)作后打印輸出文本總數(shù)和結(jié)尾狀態(tài)標(biāo)志。

           

          實(shí)際動(dòng)作在大括號(hào){ }內(nèi)指明。動(dòng)作大多數(shù)用來打印,但是還有些更長(zhǎng)的代碼諸如i f和循環(huán)語句及循環(huán)退出結(jié)構(gòu)。如果不指明采取動(dòng)作,awk將打印出所有瀏覽出來的記錄。

           

          awk執(zhí)行時(shí),其瀏覽域標(biāo)記為$1,$2...$n。這種方法稱為域標(biāo)識(shí)。使用這些域標(biāo)識(shí)將更容易對(duì)域進(jìn)行進(jìn)一步處理。

           

          使用$1 , $3表示參照第1和第3域,注意這里用逗號(hào)做域分隔。如果希望打印一個(gè)有5個(gè)域

          的記錄的所有域,不必指明$1 ,$2 , $3 , $4 , $5,可使用$0,意即所有域。

          為打印一個(gè)域或所有域,使用print命令。這是一個(gè)awk動(dòng)作

           

          awk的運(yùn)行過程:

              如果BEGIN區(qū)塊存在,awk執(zhí)行它指定的actions。

               awk從輸入文件中讀取一行,稱為一條輸入記錄。(如果輸入文件省略,將從標(biāo)準(zhǔn)輸入讀取)

               awk將讀入的記錄分割成字段,將第1個(gè)字段放入變量$1中,第2個(gè)字段放入$2,以此類推。$0表示整條記錄。

               把當(dāng)前輸入記錄依次與每一個(gè)awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執(zhí)行對(duì)應(yīng)的actions。如果不匹配,就跳過對(duì)應(yīng)的actions,直到比較完所有的awk_cmd。

               當(dāng)一條輸入記錄比較了所有的awk_cmd后,awk讀取輸入的下一行,繼續(xù)重復(fù)步驟,這個(gè)過程一直持續(xù),直到awk讀取到文件尾。

               當(dāng)awk讀完所有的輸入行后,如果存在END,就執(zhí)行相應(yīng)的actions。

           

          入門實(shí)例:

          例1:顯示/etc/passwd文件中的用戶名和登錄shell

          spacer.gif

          如果只是顯示/etc/passwd的賬戶和賬戶對(duì)應(yīng)的shell,而賬戶與shell之間以tab鍵分割

          spacer.gif

          如果只是顯示/etc/passwd文件中的用戶名和登錄shell, 而賬戶與shell之間以逗號(hào)分割

          spacer.gif

          注:awk的總是輸出到標(biāo)準(zhǔn)輸出,如果想讓awk輸出到文件,可以使用重定向。

           

          例2:顯示/etc/passwd文件中的UID大于500的所有用戶的用戶名和登錄shell

          spacer.gif

          例3:如果只是顯示/etc/passwd文件中的UID大于500的用戶名和登錄shell,而賬戶與shell之間以逗號(hào)分割,而且在所有行添加列名name,shell,在最后一行添加"blue,/bin/nosh"。

          spacer.gif

          注:

          1.awk 后面接兩個(gè)單引號(hào)并加上大括號(hào) {} 來設(shè)定想要對(duì)數(shù)據(jù)進(jìn)行的處理動(dòng)作

          2.awk工作流程是這樣的:先執(zhí)行BEGING,然后讀取文件,讀入有\n換行符分割的一條記錄,然后將記錄按指定的域分隔符劃分域,填充域,$0則表示所有域,$1表示第一個(gè)域,$n表示第n個(gè)域,隨后開始執(zhí)行模式所對(duì)應(yīng)的動(dòng)作。接著開始讀入第二條記錄······直到所有的記錄都讀完,最后執(zhí)行END操作。

          思考題:如何打印所有記錄(以/etc/passwd中的內(nèi)容為例)

          spacer.gif

          4:搜索/etc/passwdroot關(guān)鍵字的所有行

          spacer.gif 

          這種是pattern(模式)的使用示例,匹配了pattern(這里是root)的行才會(huì)執(zhí)行action(沒有指定action,默認(rèn)輸出每行的內(nèi)容)

          搜索支持正則表達(dá)式,例如找root開頭的:

          spacer.gif

          搜索/etc/passwdroot關(guān)鍵字的所有行,并顯示對(duì)應(yīng)的shell

          spacer.gif

          這里指定了action{print $7}

          posted on 2014-11-27 17:43 ♂游泳的魚 閱讀(8082) 評(píng)論(1)  編輯  收藏 所屬分類: SQL SERVER

          FeedBack:
          # re: 正則表達(dá)式和grep命令的用法
          2014-11-28 10:14 | 獵頭平臺(tái)
          正則表達(dá)式我正在努力學(xué)習(xí)掌握中。  回復(fù)  更多評(píng)論
            

          <2014年11月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          主站蜘蛛池模板: 义乌市| 东辽县| 百色市| 六枝特区| 江油市| 石景山区| 新昌县| 炎陵县| 英德市| 项城市| 酒泉市| 夏河县| 融水| 晴隆县| 西贡区| 昌江| 思茅市| 济宁市| 社旗县| 普陀区| 漾濞| 溆浦县| 娱乐| 沐川县| 鲜城| 临清市| 永德县| 玉环县| 田东县| 西藏| 浦城县| 荣昌县| 莆田市| 临洮县| 隆化县| 葫芦岛市| 沐川县| 嵩明县| 开阳县| 左贡县| 台江县|