原文地址:http://blog.chinaunix.net/uid-15811445-id-176318.html
Shell
shell 測試表達式
-a file 檢查文件是否存在(與-e同)
-b file 檢查文件是否為特殊塊設備
-c file 檢查文件是否為特殊字符設備
-d fil 檢查文件是否為目錄
-e file 檢查文件是否存在(與-a同)
-g file 檢查文件屬性位set- group-id是否置1
-h file 檢查文件是否為符號鏈接(與-L 同)
-k file 檢查文件是否設置了粘滯位(sticky bit)
-L file 檢查文件是否為符號鏈接(與-h同)
-n string 檢查字符串長度是否大于0字節
-O file 檢查用戶是否擁有該文件
-p file 檢查文件是否為命名管道
-r file 檢查文件(對用戶)是否可讀
-s file 檢查文件是否存在且長度大于0字節
-S file 檢查文件是否存在且為套接字(socket)
-t fd 檢查文件描述符是否與終端相關聯
-u file 檢查文件屬性位set-user-id是否置1
-w file 檢查文件(對用戶)是否可寫
-x file 檢查文件(對用戶)是否可執行
-z string 檢查字符串長度是否為0字節
exPR1 -a expr2 檢查兩個表達式是否皆為真
expr1 -o expr2 檢查兩個表達式是否至少有一個為真
file1 -nt file2 檢查第一個文件是否比第二個文件新(利用修改時間戳比較)
file1 -ot file2 檢查第一個文件是否比第二個文件舊(利用修改時間 戳比較)
file1 -ef file2 檢查兩個文件是否由鏈接關聯在一起(硬鏈接或符號鏈接)
var1 = var2 檢查第一個變量與第二個變量是否相等
var1 -eq var2 檢查第一個變量與第二個變量是否相等
var1 -ge var2 檢查第一個變量是否大于或等于第二個變量
var1 -gt var2 檢查第一個變量是否大于第二個變量
var1 -le var2 檢查第一個變量是否小于或等于第二個變量
var1 -lt var2 檢查第一個變量是否小于第二個變量
var1 != var2 檢查第一個變量是否不等于第二個變量
var1 -ne var2 檢查第一個變量是否不等于第二個變量
AWK
一、AWK運算符介紹 賦值運算符 = += -= *= /= %= ^= **= 賦值語句 邏輯運算符 || 邏輯或 && 邏輯與 正則運算符 ~ ~! 匹配正則表達式和不匹配正則表達式 關系運算符 < <= > >= != == 關系運算符 算術運算符 + - 加,減 * / & 乘,除與求余 + - ! 一元加,減和邏輯非 ^ *** 求冪 ++ -- 增加或減少,作為前綴或后綴 其它運算符 $ 字段引用 空格 字符串連接符 ?: C條件表達式 in 數組中是否存在某鍵值 說明:awk運算符基本與c語言相同。表達式及功能基本相同 二、實例介紹 awk賦值運算符 a+=5; 等價于:a=a+5; 其它同類 awk邏輯運算符 [@localhost ~]$ awk 'BEGIN{a=1;b=2;print (a>5 && b<=2),(a>5 || b<=2);}' 0 1 awk正則運算符 [@localhost ~]$ awk 'BEGIN{a="100testa";if(a ~ /^100*/){print "ok";}}' ok awk關系運算符 如:> < 可以作為字符串比較,也可以用作數值比較,關鍵看操作數如果是字符串 就會轉換為字符串比較。兩個都為數字 才轉為數值比較。字符串比較:按照ascii碼順序比較。 [@localhost ~]$ awk 'BEGIN{a="11";if(a >= 9){print "ok";}}' [@localhost ~]$ awk 'BEGIN{a=11;if(a >= 9){print "ok";}}' ok awk算術運算符 說明,所有用作算術運算符 進行操作,操作數自動轉為數值,所有非數值都變為0。 [@localhost ~]$ awk 'BEGIN{a="b";print a++,++a;}' 0 2 其它運算符 ?:運算符 [@localhost ~]$ awk 'BEGIN{a="b";print a=="b"?"ok":"err";}' ok in運算符 [@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr[1]="c";print (a in arr);}' 0 [@localhost ~]$ awk 'BEGIN{a="b";arr[0]="b";arr["b"]="c";print (a in arr);}' 1
三、awk Extended Regular Expression (ERES)基礎表達式符號介紹 字符 功能 + 指定如果一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行: awk '/smith+ern/' testfile 將包含字符 smit,后跟一個或多個 h 字符,并以字符 ern 結束的字符串的任何記錄打印至標準輸出。此示例中的輸出是: smithern, harry smithhern, anne ? 指定如果零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行: awk '/smith?/' testfile 將包含字符 smit,后跟零個或一個 h 字符的實例的所有記錄打印至標準輸出。此示例中的輸出是: smith, alan smithern, harry smithhern, anne smitters, alexis | 指定如果以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行: awk '/allen | alan /' testfile 將包含字符串 allen 或 alan 的所有記錄打印至標準輸出。此示例中的輸出是: smiley, allen smith, alan ( ) 在正則表達式中將字符串組合在一起。命令行: awk '/a(ll)?(nn)?e/' testfile 將具有字符串 ae 或 alle 或 anne 或 allnne 的所有記錄打印至標準輸出。此示例中的輸出是: smiley, allen smithhern, anne {m} 指定如果正好有 m 個模式的具體值位于字符串中,則字符串匹配。命令行: awk '/l{2}/' testfile 打印至標準輸出 smiley, allen {m,} 指定如果至少 m 個模式的具體值在字符串中,則字符串匹配。命令行: awk '/t{2,}/' testfile 打印至標準輸出: smitters, alexis {m, n} 指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行: awk '/er{1, 2}/' testfile 打印至標準輸出: smithern, harry smithern, anne smitters, alexis [String] 指定正則表達式與方括號內 String 變量指定的任何字符匹配。命令行: awk '/sm[a-h]/' testfile 將具有 sm 后跟以字母順序從 a 到 h 排列的任何字符的所有記錄打印至標準輸出。此示例的輸出是: smawley, andy [^String] 在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內的任何字符不匹配。這樣,
命令行: awk '/sm[^a-h]/' testfile 打印至標準輸出: smiley, allen smith, alan smithern, harry smithhern, anne smitters, alexis ~,!~ 表示指定變量與正則表達式匹配(代字號)或不匹配(代字號、感嘆號)的條件語句。命令行: awk '$1 ~ /n/' testfile 將第一個字段包含字符 n 的所有記錄打印至標準輸出。此示例中的輸出是: smithern, harry smithhern, anne ^ 指定字段或記錄的開頭。命令行: awk '$2 ~ /^h/' testfile 將把字符 h 作為第二個字段的第一個字符的所有記錄打印至標準輸出。此示例中的輸出是: smithern, harry $ 指定字段或記錄的末尾。命令行: awk '$2 ~ /y$/' testfile 將把字符 y 作為第二個字段的最后一個字符的所有記錄打印至標準輸出。此示例中的輸出是: smawley, andy smithern, harry . (句號)表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行: awk '/a..e/' testfile 將具有以兩個字符隔開的字符 a 和 e 的所有記錄打印至標準輸出。此示例中的輸出是: smawley, andy smiley, allen smithhern, anne *(星號)表示零個或更多的任意字符。命令行: awk '/a.*e/' testfile 將具有以零個或更多字符隔開的字符 a 和 e 的所有記錄打印至標準輸出。此示例中的輸出是: smawley, andy smiley, allen smithhern, anne smitters, alexis / (反斜杠)轉義字符。當位于在擴展正則表達式中具有特殊含義的任何字符之前時,轉義字符除去該字符的任何特殊含義。
例如,命令行: /a///// 將與模式 a // 匹配,因為反斜杠否定斜杠作為正則表達式定界符的通常含義。要將反斜杠本身指定為字符,則使用雙反斜杠。有關反斜杠及其使用的更多信息,請參閱以下關于轉義序列的內容。 與PERs相比,主要是一些結合類型表示符沒有了:包括:”/d,/D,/s,/S,/t,/v,/n,/f,/r”其它功能基本一樣的。
四、awk 常見調用正則表達式方法 awk語句中: awk ‘/REG/{action}’ /REG/為正則表達式,可以將$0中,滿足條件記錄 送入到:action進行處理. awk正則運算語句(~,~!等同!~) [@centos5 ~]$ awk 'BEGIN{info="this is a test";if( info ~ /test/){print "ok"}}' ok awk內置使用正則表達式函數
awk內置函數,主要分以下3種類似:算數函數、字符串函數、其它一般函數、時間函數 一、算術函數: 以下算術函數執行與 C 語言中名稱相同的子例程相同的操作: atan2( y, x ) 返回 y/x 的反正切。 cos( x ) 返回 x 的余弦;x 是弧度。 sin( x ) 返回 x 的正弦;x 是弧度。 exp( x ) 返回 x 冪函數。 log( x ) 返回 x 的自然對數。 sqrt( x ) 返回 x 平方根。 int( x ) 返回 x 的截斷至整數的值。 rand( ) 返回任意數字 n,其中 0 <= n < 1。 srand( [Expr] ) 將 rand 函數的種子值設置為 Expr 參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。 舉例說明: [@centos5 ~]$ awk 'BEGIN{OFMT="%.3f";fs=sin(1);fe=exp(10);fl=log(10);fi=int(3.1415);print fs,fe,fl,fi;}' 0.841 22026.466 2.303 3 OFMT 設置輸出數據格式是保留3位小數 獲得隨機數: [@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 78 [@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 31 [@centos5 ~]$ awk 'BEGIN{srand();fr=int(100*rand());print fr;}' 41 二、字符串函數是: 函數 說明 gsub( Ere, Repl, [ In ] )
除了正則表達式所有具體值被替代這點,它和 sub 函數完全一樣地執行,。 sub( Ere, Repl, [ In ] )
用 Repl 參數指定的字符串替換 In 參數指定的字符串中的由 Ere 參數指定的擴展正則表達式的第一個具體值。sub 函數返回替換的數量。出現在 Repl 參數指定的字符串中的 &(和符號)由 In 參數指定的與 Ere 參數的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數,缺省值是整個記錄($0 記錄變量)。 index( String1, String2 )
在由 String1 參數指定的字符串(其中有出現 String2 指定的參數)中,返回位置,從 1 開始編號。如果 String2 參數不在 String1 參數中出現,則返回 0(零)。 length [(String)]
返回 String 參數指定的字符串的長度(字符形式)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。 blength [(String)]
返回 String 參數指定的字符串的長度(以字節為單位)。如果未給出 String 參數,則返回整個記錄的長度($0 記錄變量)。 substr( String, M, [ N ] )
返回具有 N 參數指定的字符數量子串。子串從 String 參數指定的字符串取得,其字符以 M 參數指定的位置開始。M 參數指定為將 String 參數中的第一個字符作為編號 1。如果未指定 N 參數,則子串的長度將是 M 參數指定的位置到 String 參數的末尾 的長度。 match( String, Ere )
在 String 參數指定的字符串(Ere 參數指定的擴展正則表達式出現在其中)中返回位置(字符形式),從 1 開始編號,或如果 Ere 參數不出現,則返回 0(零)。RSTART 特殊變量設置為返回值。RLENGTH特殊變量設置為匹配的字符串的長度,或如果未找到任何匹配,則設置為 -1(負一)。 split( String, A, [Ere] )
將 String 參數指定的參數分割為數組元素 A[1], A[2], . . ., A[n],并返回 n 變量的值。此分隔可以通過 Ere 參數指定的擴展正則表達式進行,或用當前字段分隔符(FS 特殊變量)來進行(如果沒有給出 Ere 參數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 數組中的元素用字符串值來創建。 tolower( String )
返回 String 參數指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。 toupper( String )
返回 String 參數指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 范疇定義。 sprintf(Format, Expr, Expr, . . . )
根據 Format 參數指定的 printf 子例程格式字符串來格式化 Expr 參數指定的表達式并返回最后生成的字符串。 Ere都可以是正則表達式 gsub,sub使用 [@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";gsub(/[0-9]+/,"!",info);print info}' this is a test!test! 在 info中查找滿足正則表達式,/[0-9]+/ 用””替換,并且替換后的值,賦值給info 未給info值,默認是$0 查找字符串(index使用) [@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print index(info,"test")?"ok":"no found";}' ok 未找到,返回0 正則表達式匹配查找(match使用) [@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print match(info,/[0-9]+/)?"ok":"no found";}'
ok 截取字符串(substr使用) [@centos5 ~]$ awk 'BEGIN{info="this is a test2010test!";print substr(info,4,10);}' s is a tes 從第 4個 字符開始,截取10個長度字符串 字符串分割(split使用) [@centos5 ~]$ awk 'BEGIN{info="this is a test";split(info,tA," ");print length(tA);for(k in tA){print k,tA[k];}}' 4 4 test 1 this 2 is 3 a 分割info,動態創建數組tA,這里比較有意思,awk for …in 循環,是一個無序的循環。 并不是從數組下標1…n ,因此使用時候需要注意。 格式化字符串輸出(sprintf使用) 格式化字符串格式: 其中格式化字符串包括兩部分內容: 一部分是正常字符, 這些字符將按原樣輸出; 另一部分是格式化規定字符, 以"%"開始, 后跟一個或幾個規定字符,用來確定輸出內容格式。 格式符 說明 %d 十進制有符號整數 %u 十進制無符號整數 %f 浮點數 %s 字符串 %c 單個字符 %p 指針的值 %e 指數形式的浮點數 %x %X 無符號以十六進制表示的整數 %o 無符號以八進制表示的整數 %g 自動選擇合適的表示法 [@centos5 ~]$ awk 'BEGIN{n1=124.113;n2=-1.224;n3=1.2345; printf("%.2f,%.2u,%.2g,%X,%o/n",n1,n2,n3,n1,n1);}' 124.11,18446744073709551615,1.2,7C,174 三、一般函數是: close( Expression )
用同一個帶字符串值的 Expression 參數來關閉由 print 或 printf 語句打開的或調用 getline 函數打開的文件或管道。如果文件或管道成功關閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,并稍后在同一個程序中讀取文件,則 close 語句是必需的。 system(Command )
執行 Command 參數指定的命令,并返回退出狀態。等同于 system 子例程。 Expression | getline [ Variable ]
從來自 Expression 參數指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,并將該記錄的值指定給 Variable 參數指定的變量。如果當前未打開將 Expression 參數的值作為其命令名稱的流,則創建流。創建的流等同于調用 popen 子例程,此時 Command 參數取 Expression 參數的值且 Mode 參數設置為一個是 r 的值。只要流保留打開且 Expression 參數求得同一個字符串,則對 getline 函數的每次后續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。 getline [ Variable ] < Expression
從 Expression 參數指定的文件讀取輸入的下一個記錄,并將 Variable 參數指定的變量設置為該記錄的值。只要流保留打開且 Expression 參數對同一個字符串求值,則對 getline 函數的每次后續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變量和 NF 特殊變量設置為從流讀取的記錄。 getline [ Variable ]
將 Variable 參數指定的變量設置為從當前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 參數,則 $0 記錄變量設置為該記錄的值,還將設置 NF、NR 和 FNR 特殊變量。 打開外部文件(close用法) [@centos5 ~]$ awk 'BEGIN{while("cat /etc/passwd"|getline){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin 逐行讀取外部文件(getline使用方法) [@centos5 ~]$ awk 'BEGIN{while(getline < "/etc/passwd"){print $0;};close("/etc/passwd");}' root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin [@centos5 ~]$ awk 'BEGIN{print "Enter your name:";getline name;print name;}' Enter your name: chengmo chengmo 調用外部應用程序(system使用方法) [@centos5 ~]$ awk 'BEGIN{b=system("ls -al");print b;}' total 42092 drwxr-xr-x 14 chengmo chengmo 4096 09-30 17:47 . drwxr-xr-x 95 root root 4096 10-08 14:01 .. b返回值,是執行結果。 四、時間函數 函數名 說明 mktime( YYYY MM DD HH MM SS[ DST]) 生成時間格式 strftime([format [, timestamp]]) 格式化時間輸出,將時間戳轉為時間字符串 具體格式,見下表. systime() 得到時間戳,返回從1970年1月1日開始到當前時間(不計閏年)的整秒數 創建指定時間(mktime使用) [@centos5 ~]$ awk 'BEGIN{tstamp=mktime("2001 01 01 12 12 12");print strftime("%c",tstamp);}' 2001年01月01日 星期一 12時12分12秒 [@centos5 ~]$ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=mktime("2001 02 01 0 0 0");print tstamp2-tstamp1;}' 2634468 求2個時間段中間時間差,介紹了strftime使用方法 [@centos5 ~]$ awk 'BEGIN{tstamp1=mktime("2001 01 01 12 12 12");tstamp2=systime();print tstamp2-tstamp1;}' 308201392 strftime日期和時間格式說明符 格式 描述 %a 星期幾的縮寫(Sun) %A 星期幾的完整寫法(Sunday) %b 月名的縮寫(Oct) %B 月名的完整寫法(October) %c 本地日期和時間 %d 十進制日期 %D 日期 08/20/99 %e 日期,如果只有一位會補上一個空格 %H 用十進制表示24小時格式的小時 %I 用十進制表示12小時格式的小時 %j 從1月1日起一年中的第幾天 %m 十進制表示的月份 %M 十進制表示的分鐘 %p 12小時表示法(AM/PM) %S 十進制表示的秒 %U 十進制表示的一年中的第幾個星期(星期天作為一個星期的開始) %w 十進制表示的星期幾(星期天是0) %W 十進制表示的一年中的第幾個星期(星期一作為一個星期的開始) %x 重新設置本地日期(08/20/99) %X 重新設置本地時間(12:00:00) %y 兩位數字表示的年(99) %Y 當前月份 %Z 時區(PDT) %% 百分號(%)
SED
sed命令的調用:
在命令行鍵入命令;將sed命令插入腳本文件,然后調用sed;將sed命令插入腳本文件,并使sed腳本可執行
sed [option] sed命令 輸入文件 在命令行使用sed命令,實際命令要加單引號
sed [option] -f sed腳本文件 輸入文件 使用sed腳本文件
sed 腳本文件 [option] 輸入文件 第一行具有sed命令解釋器的sed腳本文件
option如下:
-n 不打印; sed不寫編輯行到標準輸出,缺省為打印所有行(編輯和未編輯),p命令可以用來打印編輯行
-c 下一命令是編輯命令,使用多項編輯時加入此選項
-f 如果正在調用sed腳本文件,使用此選項,此選項通知sed一個腳本文件支持所用的sed命令,如
sed -f myscript.sed input_file 這里myscript.sed即為支持sed命令的文件
使用重定向文件即可保存sed的輸出
使用sed在文本中定位文本的方式:
x x為一行號,比如1
x,y 表示行號范圍從x到y,如2,5表示從第2行到第5行
/pattern/ 查詢包含模式的行,如/disk/或/[a-z]/
/pattern/pattern/ 查詢包含兩個模式的行,如/disk/disks/
/pattern/,x 在給定行號上查詢包含模式的行,如/disk/,3
x,/pattern/ 通過行號和模式查詢匹配行,如 3,/disk/
x,y! 查詢不包含指定行號x和y的行
基本sed編輯命令:
p 打印匹配行 c/ 用新文本替換定位文本
= 顯示文件行號 s 使用替換模式替換相應模式
a/ 在定位行號后附加新文本信息 r 從另一個文本中讀文本
i/ 在定位行號后插入新文本信息 w 寫文本到一個文件
d 刪除定位行 q 第一個模式匹配完成后退出或立即退出
l 顯示與八進制ASCII代碼等價的控制字符 y 傳送字符
n 從另一個文本中讀文本下一行,并附加在下一行 {} 在定位行執行的命令組
g 將模式2粘貼到/pattern n/
基本sed編程舉例:
使用p(rint)顯示行: sed -n '2p' temp.txt 只顯示第2行,使用選項n
打印范圍: sed -n '1,3p' temp.txt 打印第1行到第3行
打印模式: sed -n '/movie/'p temp.txt 打印含movie的行
使用模式和行號查詢: sed -n '3,/movie/'p temp.txt 只在第3行查找movie并打印
顯示整個文件: sed -n '1,$'p temp.txt $為最后一行
任意字符: sed -n '/.*ing/'p temp.txt 注意是.*ing,而不是*ing
打印行號: sed -e '/music/=' temp.txt
附加文本:(創建sed腳本文件)chmod u+x script.sed,運行時./script.sed temp.txt
#!/bin/sed -f
/name1/ a/ #a/表示此處換行添加文本
HERE ADD NEW LINE. #添加的文本內容
插入文本: /name1/ a/ 改成 4 i/ 4表示行號,i插入
修改文本: /name1/ a/ 改成 /name1/ c/ 將修改整行,c修改
刪除文本: sed '1d' temp.txt 或者 sed '1,4d' temp.txt
替換文本: sed 's/source/OKSTR/' temp.txt 將source替換成OKSTR
sed 's//$//g' temp.txt 將文本中所有的$符號全部刪除
sed 's/source/OKSTR/w temp2.txt' temp.txt 將替換后的記錄寫入文件temp2.txt
替換修改字符串: sed 's/source/"ADD BEFORE" &/p' temp.txt
結果將在source字符串前面加上"ADD BEFORE",這里的&表示找到的source字符并保存
sed結果寫入到文件: sed '1,2 w temp2.txt' temp.txt
sed '/name/ w temp2.txt' temp.txt
從文件中讀文本: sed '/name/r temp2.txt' temp.txt
在每列最后加文本: sed 's/[0-9]*/& Pass/g' temp.txt
從shell向sed傳值: echo $NAME | sed "s/go/$REP/g" 注意需要使用雙引號
快速一行命令:
's//.$//g' 刪除以句點結尾行
'-e /abcd/d' 刪除包含abcd的行
's/[][][]*/[]/g' 刪除一個以上空格,用一個空格代替
's/^[][]*//g' 刪除行首空格
's//.[][]*/[]/g' 刪除句號后跟兩個或更多的空格,用一個空格代替
'/^$/d' 刪除空行
's/^.//g' 刪除第一個字符,區別 's//.//g'刪除所有的句點
's/COL/(.../)//g' 刪除緊跟COL的后三個字母
's/^////g' 刪除路徑中第一個/
///////////////////////////////////////////////////////////////////////
1、使用句點匹配單字符
句點“.”可以匹配任意單字符?!?”可以匹配字符串頭,也可以是中間任意字符。假定正在過濾一個文本文件,對于一個有1 0個字符的腳本集,要求前4個字符之后為X C,匹配操作如下:. . . .X C. . . .
2、在行首以^匹配字符串或字符序列
^只允許在一行的開始匹配字符或單詞。在行首第4個字符為1,匹配操作表示為:^ . . . 1
3、在行尾以$匹配字符串或字符
可以說$與^正相反,它在行尾匹配字符串或字符, $符號放在匹配單詞后。如果在行尾匹配單詞j e t 0 1,操作如下:j e t 0 1 $ 如果只返回包含一個字符的行,操作如下:^ . $
4、使用*匹配字符串中的單字符或其重復序列
使用此特殊字符匹配任意字符或字符串的重復多次表達式。
5、使用/屏蔽一個特殊字符的含義
有時需要查找一些字符或字符串,而它們包含了系統指定為特殊字符的一個字符。如果要在正則表達式中匹配以* . p a s結尾的所有文件,可做如下操作:/ * / . p a s
6、使用[]匹配一個范圍或集合
使用[ ]匹配特定字符串或字符串集,可以用逗號將括弧內要匹配的不同字符串分開,但并不強制要求這樣做(一些系統提倡在復雜的表達式中使用逗號),這樣做可以增 加模式的可讀性。使用“ -”表示一個字符串范圍,表明字符串范圍從“ -”左邊字符開始,到“ -”右邊字符結束。假定要匹配任意一個數字,可以使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,則使用:[ A - Z a - z ]表明從A - Z、a - z的字母范圍。
7、使用/{/}匹配模式結果出現的次數
使用*可匹配所有匹配結果任意次,但如果只要指定次數,就應使用/ { / },此模式有三種形式,即:
pattern/{n/} 匹配模式出現n次。
pattern/{n,/} 匹配模式出現最少n次。
pattern/{n,m} 匹配模式出現n到m次之間,n , m為0 - 2 5 5中任意整數。
匹配字母A出現兩次,并以B結尾,操作如下:
A / { 2 / } B 匹配值為A A B
匹配A至少4次,使用:
A / { 4 , / } B
基本語法
在對正則表達式的功能和作用有了初步的了解之后,我們就來具體看一下正則表達式的語法格式。
正則表達式的形式一般如下:
/love/
其中位于“/”定界符之間的部分就是將要在目標對象中進行匹配的模式。用戶只要把希望查找匹配對象的模式內容放入“/”定界符之間即可。為了能夠使用戶 更加靈活的定制模式內容,正則表達式提供了專門的“元字符”。所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符,可以用來規定其前導字符(即位 于元字符前面的字符)在目標對象中的出現模式。
較為常用的元字符包括: “+”, “*”,以及 “?”。其中,“+”元字符規定其前導字符必須在目標對象中連續出現一次或多次,“*”元字符規定其前導字符必須在目標對象中出現零次或連續多次,而“?”元字符規定其前導對象必須在目標對象中連續出現零次或一次。
下面,就讓我們來看一下正則表達式元字符的具體應用。
/fo+/
因為上述正則表達式中包含“+”元字符,表示可以與目標對象中的 “fool”, “fo”, 或者 “football”等在字母f后面連續出現一個或多個字母o的字符串相匹配。
/eg*/
因為上述正則表達式中包含“*”元字符,表示可以與目標對象中的 “easy”, “ego”, 或者 “egg”等在字母e后面連續出現零個或多個字母g的字符串相匹配。
/Wil?/
因為上述正則表達式中包含“?”元字符,表示可以與目標對象中的 “Win”, 或者 “Wilson”,等在字母i后面連續出現零個或一個字母l的字符串相匹配。
除了元字符之外,用戶還可以精確指定模式在匹配對象中出現的頻率。例如,
/jim{2,6}/
上述正則表達式規定字符m可以在匹配對象中連續出現2-6次,因此,上述正則表達式可以同jimmy或jimmmmmy等字符串相匹配。
其它幾個重要的元字符的使用方式。
/s: 用于匹配單個空格符,包括tab鍵和換行符;
/S: 用于匹配除單個空格符之外的所有字符;
/d: 用于匹配從0到9的數字;
/w: 用于匹配字母,數字或下劃線字符;
/W: 用于匹配所有與/w不匹配的字符;
. : 用于匹配除換行符之外的所有字符。
(說明:可以把/s和/S以及/w和/W看作互為逆運算)
下面通過實例看一下如何在正則表達式中使用上述元字符。
//s+/
上述正則表達式可以用于匹配目標對象中的一個或多個空格字符。
//d000/
如果我們手中有一份復雜的財務報表,那么我們可以通過上述正則表達式輕而易舉的查找到所有總額達千元的款項。
除了上述元字符之外,正則表達式中還具有另外一種較為獨特的專用字符,即定位符。
定位符用于規定匹配模式在目標對象中的出現位置。
較為常用的定位符包括: “^”, “$”, “/b” 以及 “/B”。其中,“^”定位符規定匹配模式必須出現在目標字符串的開頭,“$”定位符規定匹配模式必須出現在目標對象的結尾,/b定位符規定匹配模式必須 出現在目標字符串的開頭或結尾的兩個邊界之一,而“/B”定位符則規定匹配對象必須位于目標字符串的開頭和結尾兩個邊界之內,即匹配對象既不能作為目標字 符串的開頭,也不能作為目標字符串的結尾。同樣,我們也可以把“^”和“$”以及“/b”和“/B”看作是互為逆運算的兩組定位符。舉例來說:
/^hell/
因為上述正則表達式中包含“^”定位符,所以可以與目標對象中以 “hell”, “hello”或 “hellhound”開頭的字符串相匹配。
/ar$/
因為上述正則表達式中包含“$”定位符,所以可以與目標對象中以 “car”, “bar”或 “ar” 結尾的字符串相匹配。
//bbom/
因為上述正則表達式模式以“/b”定位符開頭,所以可以與目標對象中以 “bomb”, 或 “bom”開頭的字符串相匹配。
/man/b/
因為上述正則表達式模式以“/b”定位符結尾,所以可以與目標對象中以 “human”, “woman”或 “man”結尾的字符串相匹配。
為了能夠方便用戶更加靈活的設定匹配模式,正則表達式允許使用者在匹配模式中指定某一個范圍而不局限于具體的字符。例如:
/[A-Z]/
上述正則表達式將會與從A到Z范圍內任何一個大寫字母相匹配。
/[a-z]/
上述正則表達式將會與從a到z范圍內任何一個小寫字母相匹配。
/[0-9]/
上述正則表達式將會與從0到9范圍內任何一個數字相匹配。
/([a-z][A-Z][0-9])+/
上述正則表達式將會與任何由字母和數字組成的字符串,如 “aB0” 等相匹配。這里需要提醒用戶注意的一點就是可以在正則表達式中使用 “()” 把字符串組合在一起?!?)”符號包含的內容必須同時出現在目標對象中。因此,上述正則表達式將無法與諸如 “abc”等的字符串匹配,因為“abc”中的最后一個字符為字母而非數字。
如果希望在正則表達式中實現類似編程邏輯中的“或”運算,在多個不同的模式中任選一個進行匹配的話,可以使用管道符 “|”。例如:
/to|too|2/
上述正則表達式將會與目標對象中的 “to”, “too”, 或 “2” 相匹配。
正則表達式中還有一個較為常用的運算符,即否定符 “[^]”。與我們前文所介紹的定位符 “^” 不同,否定符 “[^]”規定目標對象中不能存在模式中所規定的字符串。例如:
/[^A-C]/
上述字符串將會與目標對象中除A,B,和C之外的任何字符相匹配。一般來說,當“^”出現在 “[]”內時就被視做否定運算符;而當“^”位于“[]”之外,或沒有“[]”時,則應當被視做定位符。
當用戶需要在正則表達式的模式中加入元字符,并查找其匹配對象時,可以使用轉義符“/”。例如:
/Th/*/
上述正則表達式將會與目標對象中的“Th*”而非“The”等相匹配。
sed 字符類
[:alnum:] 字母數字 [a-z A-Z 0-9]
[:alpha:] 字 母 [a-z A-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字 [0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進制數字 [0-9 a-f A-F]
新聞熱點
疑難解答