SHELL SED AWK 語法

原文地址:http://blog.chinaunix.net/uid-15811445-id-176318.htmlhtml

Shellgit

shell 測試表達式正則表達式

-a file 檢查文件是否存在(與-e同)shell

-b file 檢查文件是否爲特殊塊設備編程

-c file 檢查文件是否爲特殊字符設備centos

-d fil 檢查文件是否爲目錄數組

-e file 檢查文件是否存在(與-a同)bash

-g file 檢查文件屬性位set- group-id是否置1socket

-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

1、AWK運算符介紹
賦值運算符
= += -= *= /= %= ^= **=     賦值語句
邏輯運算符
||     邏輯或
&&     邏輯與
正則運算符
~ ~!     匹配正則表達式和不匹配正則表達式
關係運算符
< <= > >= != ==     關係運算符
算術運算符
+ -     加,減
* / &     乘,除與求餘
+ - !     一元加,減和邏輯非
^ ***     求冪
++ --     增長或減小,做爲前綴或後綴
其它運算符
$     字段引用
空格 字符串鏈接符
?:     C條件表達式
in     數組中是否存在某鍵值
說明:awk運算符基本與c語言相同。表達式及功能基本相同
2、實例介紹
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

3、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」其它功能基本同樣的。

4、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種相似:算數函數、字符串函數、其它通常函數、時間函數
1、算術函數:
如下算術函數執行與 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
2、字符串函數是:
函數 說明
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
3、通常函數是:
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返回值,是執行結果。
4、時間函數
函數名 說明
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 0個字符的腳本集,要求前4個字符以後爲X C,匹配操做以下:. . . .X C. . . .

二、在行首以^匹配字符串或字符序列

^只容許在一行的開始匹配字符或單詞。在行首第4個字符爲1,匹配操做表示爲:^ . . . 1

三、在行尾以$匹配字符串或字符

能夠說$與^正相反,它在行尾匹配字符串或字符, $符號放在匹配單詞後。若是在行尾匹配單詞j e t 0 1,操做以下:j e t 0 1 $ 若是隻返回包含一個字符的行,操做以下:^ . $

四、使用*匹配字符串中的單字符或其重複序列

使用此特殊字符匹配任意字符或字符串的重複屢次表達式。

五、使用\屏蔽一個特殊字符的含義

有時須要查找一些字符或字符串,而它們包含了系統指定爲特殊字符的一個字符。若是要在正則表達式中匹配以* . p a s結尾的全部文件,可作以下操做:\ * \ . p a s

六、使用[]匹配一個範圍或集合

使用[ ]匹配特定字符串或字符串集,能夠用逗號將括弧內要匹配的不一樣字符串分開,但並不強制要求這樣作(一些系統提倡在複雜的表達式中使用逗號),這樣作能夠增 加模式的可讀性。使用「 -」表示一個字符串範圍,代表字符串範圍從「 -」左邊字符開始,到「 -」右邊字符結束。假定要匹配任意一個數字,可使用:[ 0 1 2 3 4 5 6 7 8 9 ] 要匹配任意字母,則使用:[ A - Z a - z ]代表從A - Z、a - z的字母範圍。

七、使用\{\}匹配模式結果出現的次數

使用*可匹配全部匹配結果任意次,但若是隻要指定次數,就應使用\ { \ },此模式有三種形式,即:

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]

相關文章
相關標籤/搜索