1.基本語法
選擇
|
豎直分隔符表示選擇榛臼,例如"boy|girl"
可以匹配"boy"或者"girl"
數(shù)量限定
數(shù)量限定除了我們舉例用的*,還有+加號,?問號,如果在一個模式中不加數(shù)量限定符則表示出現(xiàn)一次且僅出現(xiàn)一次:
- +表示前面的字符必須出現(xiàn)至少一次(1次或多次)伊佃,例如,"goo+gle",可以匹配"gooogle","goooogle"等;
- ?表示前面的字符最多出現(xiàn)一次(0次或1次),例如恩伺,"colou?r",可以匹配"color"或者"colour";
- 星號代表前面的字符可以不出現(xiàn)尉姨,也可以出現(xiàn)一次或者多次(0次、或1次姚淆、或多次)罐孝,例如县匠,“042”可以匹配42媳友、042斯议、0042、00042等醇锚。
范圍與優(yōu)先級
()圓括號可以用來定義模式字符串的范圍和優(yōu)先級哼御,這可以簡單的理解為是否將括號內的模式串作為一個整體。例如焊唬,"gr(a|e)y"等價于"gray|grey"恋昼,(這里體現(xiàn)了優(yōu)先級,豎直分隔符用于選擇a或者e而不是gra和ey)赶促,"(grand)?father"匹配father和grandfather(這里體驗了范圍液肌,?將圓括號內容作為一個整體匹配)。
語法
字符 | 描述 |
---|---|
\ | 將下一個字符標記為一個特殊字符鸥滨、或一個原義字符嗦哆。例如,“n”匹配字符“n”婿滓±纤伲“\n”匹配一個換行符。序列“\”匹配“\”而“(”則匹配“(”空幻。 |
^ | 匹配輸入字符串的開始位置。 |
$ | 匹配輸入字符串的結束位置容客。 |
{n} | n是一個非負整數(shù)秕铛。匹配確定的n次。例如缩挑,“o{2}”不能匹配“Bob”中的“o”但两,但是能匹配“food”中的兩個o。 |
{n,} | n是一個非負整數(shù)供置。至少匹配n次谨湘。例如,“o{2,}”不能匹配“Bob”中的“o”芥丧,但能匹配“foooood”中的所有o紧阔。“o{1,}”等價于“o+”续担∩玫ⅲ“o{0,}”則等價于“o*”。 |
{n,m} | m和n均為非負整數(shù)物遇,其中n<=m乖仇。最少匹配n次且最多匹配m次憾儒。例如,“o{1,3}”將匹配“fooooood”中的前三個o乃沙∑鹬海“o{0,1}”等價于“o?”。請注意在逗號和兩個數(shù)之間不能有空格警儒。 |
* | 匹配前面的子表達式零次或多次训裆。例如,zo能匹配“z”冷蚂、“zo”以及“zoo”缭保。等價于{0,}。 |
+ | 匹配前面的子表達式一次或多次蝙茶。例如艺骂,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”隆夯。+等價于{1,}钳恕。 |
? | 匹配前面的子表達式零次或一次。例如蹄衷,“do(es)?”可以匹配“do”或“does”中的“do”忧额。?等價于{0,1}。 |
? | 當該字符緊跟在任何一個其他限制符(*,+,?愧口,{n}睦番,{n,},{n,m})后面時耍属,匹配模式是非貪婪的托嚣。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串厚骗。例如示启,對于字符串“oooo”,“o+?”將匹配單個“o”领舰,而“o+”將匹配所有“o”夫嗓。 |
. | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符冲秽,請使用像“(.|\n)”的模式舍咖。 |
(pattern) | 匹配pattern并獲取這一匹配的子字符串。該子字符串用于向后引用锉桑。要匹配圓括號字符谎仲,請使用“(”或“)”。 |
x|y | 匹配x或y刨仑。例如郑诺,“z|food”能匹配“z”或“food”夹姥。“(z|f)ood”則匹配“zood”或“food”辙诞。 |
[xyz] | 字符集合(character class)辙售。匹配所包含的任意一個字符。例如飞涂,“[abc]”可以匹配“plain”中的“a”旦部。其中特殊字符僅有反斜線\保持特殊含義,用于轉義字符较店。其它特殊字符如星號士八、加號、各種括號等均作為普通字符梁呈。脫字符^如果出現(xiàn)在首位則表示負值字符集合婚度;如果出現(xiàn)在字符串中間就僅作為普通字符。連字符 - 如果出現(xiàn)在字符串中間表示字符范圍描述官卡;如果如果出現(xiàn)在首位則僅作為普通字符蝗茁。 |
[^xyz] | 排除型(negate)字符集合。匹配未列出的任意字符寻咒。例如哮翘,“[^abc]”可以匹配“plain”中的“plin”。 |
[a-z] | 字符范圍毛秘。匹配指定范圍內的任意字符饭寺。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符叫挟。 |
[^a-z] | 排除型的字符范圍艰匙。匹配任何不在指定范圍內的任意字符。例如霞揉,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符旬薯。 |
2.grep模式匹配命令
grep命令用于打印輸出文本中匹配的模式串晰骑,它使用正則表達式作為模式匹配的條件适秩。
參數(shù) | 說明 |
---|---|
-b | 將二進制文件作為文本來進行匹配 |
-c | 統(tǒng)計以模式匹配的數(shù)目 |
-i | 忽略大小寫 |
-n | 顯示匹配文本所在行的行號 |
-v | 反選,輸出不匹配行的內容 |
-r | 遞歸匹配查找 |
-A n | n為正整數(shù)硕舆,表示after的意思秽荞,除了列出匹配行之外,還列出后面的n行 |
-B n | n為正整數(shù)抚官,表示before的意思扬跋,除了列出匹配行之外,還列出前面的n行 |
--color=auto | 將輸出中的匹配項設置為自動顏色顯示 |
3.使用正則表達式
- 數(shù)量
# 將匹配以'z'開頭以'o'結尾的所有字符串 $ echo 'zero\nzo\nzoo' | grep 'z.*o' # 將匹配以'z'開頭以'o'結尾凌节,中間包含一個任意字符的字符串 $ echo 'zero\nzo\nzoo' | grep 'z.o' # 將匹配以'z'開頭,以任意多個'o'結尾的字符串 $ echo 'zero\nzo\nzoo' | grep 'zo*'
- 選擇
# grep默認是區(qū)分大小寫的钦听,這里將匹配所有的小寫字母 $ echo '1234\nabcd' | grep '[a-z]' # 將匹配所有的數(shù)字 $ echo '1234\nabcd' | grep '[0-9]' # 將匹配所有的數(shù)字 $ echo '1234\nabcd' | grep '[[:digit:]]' # 將匹配所有的小寫字母 $ echo '1234\nabcd' | grep '[[:lower:]]' # 將匹配所有的大寫字母 $ echo '1234\nabcd' | grep '[[:upper:]]' # 將匹配所有的字母和數(shù)字洒试,包括0-9,a-z,A-Z $ echo '1234\nabcd' | grep '[[:alnum:]]' # 將匹配所有的字母 $ echo '1234\nabcd' | grep '[[:alpha:]]'
下面包含完整的特殊符號及說明:
特殊符號 | 說明 |
---|---|
[:alnum:] | 代表英文大小寫字節(jié)及數(shù)字,亦即 0-9, A-Z, a-z |
[:alpha:] | 代表任何英文大小寫字節(jié)朴上,亦即 A-Z, a-z |
[:blank:] | 代表空白鍵與 [Tab] 按鍵兩者 |
[:cntrl:] | 代表鍵盤上面的控制按鍵垒棋,亦即包括 CR, LF, Tab, Del.. 等等 |
[:digit:] | 代表數(shù)字而已,亦即 0-9 |
[:graph:] | 除了空白字節(jié) (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵 |
[:lower:] | 代表小寫字節(jié)痪宰,亦即 a-z |
[:print:] | 代表任何可以被列印出來的字節(jié) |
[:punct:] | 代表標點符號 (punctuation symbol)叼架,亦即:" ' ? ! ; : # $... |
[:upper:] | 代表大寫字節(jié),亦即 A-Z |
[:space:] | 任何會產(chǎn)生空白的字節(jié)衣撬,包括空白鍵, [Tab], CR 等等 |
[:xdigit:] | 代表 16 進位的數(shù)字類型乖订,因此包括: 0-9, A-F, a-f 的數(shù)字與字節(jié) |
注意:之所以要使用特殊符號,是因為上面的[a-z]不是在所有情況下都管用具练,這還與主機當前的語系有關乍构,即設置在LANG環(huán)境變量的值,zh_CN.UTF-8的話[a-z]靠粪,即為所有小寫字母蜡吧,其它語系可能是大小寫交替的如,"a A b B...z Z"占键,[a-z]中就可能包含大寫字母昔善。所以在使用[a-z]時請確保當前語系的影響,使用[:lower:]則不會有這個問題畔乙。
4.sed流編輯器
sed 命令基本格式:
sed [參數(shù)]... [執(zhí)行命令] [輸入文件]... # 形如: $ sed -i '1s/sad/happy/' test # 表示將test文件中第一行的"sad"替換為"happy"
sed常用參數(shù)介紹
參數(shù) | 說明 |
---|---|
-n | 安靜模式君仆,只打印受影響的行,默認打印輸入數(shù)據(jù)的全部內容 |
-e | 用于在腳本中添加多個執(zhí)行命令一次執(zhí)行牲距,在命令行中執(zhí)行多個命令通常不需要加該參數(shù) |
-f filename | 指定執(zhí)行filename文件中的命令 |
-r | 使用擴展正則表達式返咱,默認為標準正則表達式 |
-i | 將直接修改輸入文件內容,而不是打印到標準輸出設備 |
sed執(zhí)行命令格式:
[n1][,n2]command
[n1][~step]command
# 其中一些命令可以在后面加上作用范圍牍鞠,形如:
$ sed -i 's/sad/happy/g' test # g表示全局范圍
$ sed -i 's/sad/happy/4' test # 4表示指定行中的第四個匹配字符串
其中n1,n2表示輸入內容的行號咖摹,它們之間為,逗號則表示從n1到n2行,如果為~波浪號則表示從n1開始以step為步進的所有行难述;command為執(zhí)行動作萤晴,下面為一些常用動作指令:
sed常用執(zhí)行命令
命令 | 說明 |
---|---|
s | 行內替換 |
c | 整行替換 |
a | 插入到指定行的后面 |
i | 插入到指定行的前面 |
p | 打印指定行,通常與-n參數(shù)配合使用 |
d | 刪除指定行 |
sed操作舉例
打印指定行
# 打印2-5行
$ nl passwd | sed -n '2,5p'
# 打印奇數(shù)行
$ nl passwd | sed -n '1~2p'
行內替換
# 將輸入文本中"shiyanlou" 全局替換為"hehe",并只打印替換的那一行胁后,注意這里不能省略最后的"p"命令
$ sed -n 's/shiyanlou/hehe/gp' passwd
行間替換
$ nl passwd | grep "shiyanlou"
# 刪除第21行
$ sed -n '21c\www.shiyanlou.com' passwd
(這里我們只把要刪的行打印出來了店读,并沒有真正的刪除,如果要刪除的話攀芯,請使用-i參數(shù))