正則表達式:linux
匹配一組字符:
#[ns]a.\.xls //[]用於限定字符;「.」用於匹配任意字符; \.用於轉義"."
匹配到s/na*.xls
[nN] 匹配大小寫;[0-9] 匹配0-9數字;[a-zA-Z0-9] 匹配任意字符數字
注意:"-"(連字符)是一個特殊的元字符,做爲元字符只能用在[]中間
用^元字符進行取非操做,可是必須用在[]之間
#[ns]a[^0-9]\.xls 匹配n/sa*.xls *表示任意字符正則表達式
使用元字符:
元字符本身使用必須進行轉義,"["也是一個元字符,表示字符集合的開始
#array\[[0-9]\] 匹配一個數組,顯示下表
匹配各類空白字符的元字符;
linux下#\n\n用來匹配空白行(windows下使用\r\n\r\n 回車和換行)
#\d 匹配任意一個數字字符(等價於[0-9])
#\D 匹配任意一個非數字字符(等價於[^0-9])
#array\[\d\] 仍然能夠匹配一個數組
注意:正則表達式通常大小寫是相反的意思
#\w 匹配任何一個字母數字字符(大小寫都可以)或下劃線(等價於[a-zA-Z0-9_])
#\W 匹配任何一個非字母數字或非下劃線字符(等價[^a-zA-Z0-9_])
#\s 匹配任何一個空白字符(等價於[\f\n\t\r\v])
#\S 任何一個非空字符(等價[^\f\n\t\r\v])shell
重複匹配:
注意:@字符不須要轉義;
想要匹配同一個字符的屢次重複,只須要簡單的加上+字符做爲後綴。[0-9]+ 表示多個數字重複 ‘+’也是一個元字符
#[\w.]+@[\w.]+\.\w+ 匹配一個完整的郵件地址
注意:當在字符集合裏使用的時候,像".""+"等字符被解釋爲普通字符,不須要轉義。不過轉義也能夠。
想要匹配零個或者多個字符可使用*
#\w+[\w.]*@[\w.]+\.\w+ 完整的郵箱地址(由於第一個字符不能爲.啊)
"+"和"."的區別:前者是至少匹配一次,後者是至少匹配零次(*也是一個元字符)
想要匹配0個或者一個字符可使用?
#http?://[\w.]+ //匹配一個完整的域名(https)windows
匹配的重複次數:(通常使用{}括寫來進行定義)
注意:{和}是元字符,若是須要匹配{}自己須要進行轉義。(\{3\}表示前一個字符出現了三次)
#\d{1,2}[-\/]\d{1,2}[-\/]\d{2,4} //匹配日期(月/日/年或日-月-年)
\d表示匹配數字,{1,2}表示匹配1-2次;[-\/]表示匹配-或者/
注意;?等價於{0,1}
匹配至少重複多少次:
#\d+: \$\d{3,}\.\d{2} //匹配單號和單價($---.--)
\d+:匹配單號: \$匹配美圓符號$ \d{3,}匹配數字至少三個 \.匹配小數點數組
防止過分匹配:
#<[Bb]>.*</[Bb]> //這樣子會匹配第一個<b>和最後一個</b>之間的全部
緣由:由於*和+都是貪婪型字符,能夠在以後加?就能夠變成懶惰型
#<[Bb]>.*?</[Bb]> //這樣就會匹配每個<b></b>之間的字符了bash
位置匹配:
使用邊界限定符:
#\bcat\b //限定cat的兩邊,所以固定查找cat
(空格是用來分隔單詞的字符之一)
\b是這樣一個位置:位於一個可以用來構成單詞的字符(與\w能夠匹配的字符)和一個不能用來構成單詞的字符(\W)之間
\B不匹配一個單詞邊界
#\B-\B //匹配-
字符串邊界:(用來定義字符串邊界的元字符有兩個:^定義字符串開頭;$用來定義字符串結尾)
注意:^只有用在[]中才是求非運算。
#^\s*<\?xml.*\?> //匹配<?xml.* ?>字符。
注意:^\s*將匹配一個字符串的開頭位置和隨後的零個或多個空白字符;還將注意的是.*是貪婪型的,若是xml文檔結構比較徹底就須要使用.*?懶惰型了
#</[Hh][Tt][Mm][Ll]>\s*$ //匹配一個字符串結尾的零個或者多個空白字符ssh
分行匹配模式:
啓用分行匹配模式的(?m)記號就是一個可以改變其餘元字符行爲的元字符序列。
分行匹配模式將使得正則表達式引擎把分隔符當作一個字符串分隔符來對待。在分行模式匹配下,^不只匹配正常的字符串開頭,還將匹配行分隔符(換行符)後面的開始位置;相似地,$不只匹配正常的字符串結尾,還將匹配行分隔符(換行符)後面的匹配模式
#(?m)^\s*//.*$ //匹配每行以//開頭
^\s*//.*$將匹配任何以//開頭的若干字符,最後以$結尾
加上(?m)後,整個正則表達式將換行符視爲一個字符串分隔符,這樣就能夠把每一行//打印函數
使用子表達式:
子表達式必須用()括起來.注意()也是元字符,所以須要匹配自己的時候也須要進行轉義。
#(\d{1,3}.){3}\d{1,3} //匹配IP地址
注意:這樣匹配是回存在一些不合法的IP的。
#(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))
#(19|20)\d{2} //匹配以19或20開頭的四位數測試
回朔引用:先後一致匹配
回朔引用就是讓先後匹配查找。
#<[hH][1-6]>.*?</[Hh][1-6]> 匹配標題部分,可是有可能匹配到<h1></h2>
回朔引用能夠避免先後不一致
回朔引用容許正則表達式模式引用前面的匹配結果。
#[ ]+(\w+)[ ]+\1 //匹配空格若干字符加空格若干 \1表示引用(\w+)內容
相似於sed
#echo $hello | sed 's/\(......\)\(.*\)\(...\)$/\1\3/'
\1 表示匹配模式裏的第一個子表達式.net
#<[hH]([1-6])>.*?</[hH]\1> //\1匹配前面查找到的([1-6])
注意:回朔引用只能用來引用模式裏的子表達式(())括起來的正則表達式片斷
子表達式是經過他們的相對位置來引用的:\n表示匹配第n個位置的變量
先後查找:
向前查找:就是一個以?=開頭的子表達式,須要匹配的文本跟在=後面
注意:先後查找有一個"消費"的概念"匹配和返回文本"。在向前查找中,被匹配的文本不包含在最終返回的匹配沒結果中,成爲'不消費'
#.+(?=:) //向前查找,表示遇到:就中止查找,且不輸出:(過濾協議)
這個就是"不消費",只匹配不顯示
#.+(:) //向前查找,能夠消費後面:
注意:在使用向前查找的時候,正則表達式分析器將向前查找並處理:匹配,但不會把它包括在最終的搜索結果裏。
向後查找:查找出現先在被匹配文本以前的字符(但不消費它),向後查找符?<=
#\$[0-9.]+ //匹配美圓價格
#(?<=\$)[0-9.]+ //匹配$以後的數字
把向前查找和向後查找結合起來;
#(?<=<[Hh][tT][Mm][Ll]>).*(?=</[Hh][Tt][Mm][Ll]>) //查找標籤以內的內容
對先後查找取非:
正向前查找,正向後查找:
(?=) //正向前查找
(?<=) //證向後查找
(?!) //反向前查找
(?<!) //反向後查找
#(?<=\$)\d+ 查找文本中的沒有價格(只顯示$後的數字)
#\b(?<!\$)\d+\b //負向後查找。肯定不以$開頭的數字,而且兩邊以\b空格定界符隔開
嵌入條件:
#\(?\d{3}\)?-?\d(3)-\d{4} 0或(開頭連續3個數字,0或一個),0或一個- 連續3個數字,-連續四個數字
(102) -345-7890
正則表達式裏的條件:實際上是須要使用?進行定義的。
#?匹配前一個字符或者表達式
#?=和?<=匹配前面或者後面的文本。
回朔引用條件只在前面的子表達式搜索取得成功的狀況下才容許使用一個表達式。
#(\()?\d{3}(?(1)\)|-)\d{3}-\d{4}
(?(1)\)|-)是一個回朔條件,它根據條件是否獲得知足而去匹配")"或-
#(\()?應該是匹配前括號"("的吧
總體效果就是前三位數字若是沒有括號就顯示:123-245-9800 若是有括號就顯示;(123)456-9980
先後查找條件:
#\d{5}(-\d{4})? \d{5}匹配前5個數字,(-\d{4})?匹配一個連字符和後四位數字(必須一塊兒出現或者不出現)
#\d{5}(?(?=-)-\d{4}) 向前查找,找到"-"一塊兒打印-\d{4}或者不打印(?=-向前查找並不消費)
常見問題的正則表達式解決方案:
匹配文件名中的任何字符串:
匹配文件名中的每一個字符:
匹配文件名中的字母或者數字字符:
* 匹配文件名中的任何字符串,包括空字符串
? 匹配文件名中的任何單個字符
[...] 匹配[]中所包含的任何字符
[!...] 匹配[]中非感嘆號!以後的字符
# ls [ad]* 查找a或者d開頭的文件
add.sh date.sh diaoyong diff
#ls log.[0-9]* 查找0-9的字符
#ls [a-z]* 查找a-z的數字
shell的輸入與輸出:(echo and read cat 管道)
#!/bin/bash
echo -n "Please input your name:" -n禁止echo命令輸出後換行
read name
echo -e "Mr.$name is 20 years!\n\n" -e容許字符串中轉義使用\n換行
轉義字符:\c 不換行;\n換行;\t跳格
tee命令:當執行某些命令或者腳本的時候,若是但願把輸出保存下來,就將使用tee
-a 表示能夠追加到文件
#df | tee -a file
使用tee的好處就是當你在執行任何命令的時候,均可以將顯示的結果打印定向到一個普通文件中取。
grep:(全局正則表達式版本)容許對文本文件進行模式查找。
三種變形:grep;egrep;Fgrep
#grep的經常使用選項:
-c只輸出匹配行的計數
-i不區分大小寫(只適用於單字符)
-n顯示匹配行以及行號
-v顯示不包含的匹配行
#grep "86<tab>" hello 從hello文件中查找86的行
#grep 「48[1-9]」 hello 模式匹配
# grep [aA]b hello-1 查找大小寫
#grep -i ab hello-1 -i不區分大小寫
#grep -E "ab|AB" hello 使用-E參數進行匹配'與/或'運算
#grep ‘^$’hello 查找空行
#grep -s 能夠屏蔽錯誤(當你查找的文件不存在時)
egrep 能夠多個字符查找(或的關係)
#egrep "hello|xxb|andy" /etc/passwd
awk格式化報文或從一個大的文本文件中抽取數據包。
awk的簡單做用:
抽取域;匹配正則表達式;比較域;想awk傳遞參數
awk的調用方法:
#awk -F 'command' filename
-F指定分割符,'command'真正的awk命令 filename文件名
同時能夠將awk寫在文本中,使用awk -f調用
awk腳本:
若是設置了-F選項,則awk每次讀一條記錄或一行,並使用指定的分隔符指定域。默認使用空格做爲分隔符。
awk每次在在文件中讀取一行,找到域分隔符,設置其域爲n,直到一新行,而後,劃分這一行做爲一條記錄,接着awk再次啓動下一行讀進程。
awk語句由模式和動做組成,模式能夠是任何條件語句或者正則表達式。模式包括兩個特殊字段:BEGIN和END。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後文本瀏覽動做依舊輸入文件開始執行。END語句用來在aek完成文本瀏覽動做後打印輸出文本總數和結尾狀態標誌。若是不特別指明模式,awk老是匹配或打印行數
實際動做在大括號{}內指明。動做大多數用來打印,可是仍是有些更長的代碼諸如if和循環語句以及循環退出結構。
awk中$n表明某一個域,$0表明全部域。通常動做爲print
注意:通常使用awk,sed,grep,cut等能夠在後面使用tee命令保存哦
awk打印BEGIN和END模式
# netstat -antlp | grep LISTEN | awk '{print $7}' | awk -F/ 'BEGIN {print "Port\tService\n----------------"} {print $1"\t"$2} END{print ".....\nEND of bot"}'
Port Service
----------------------
1014 rpcbind
1226 sshd
awk注意事項:
確保整個awk命令用單引號括起來。
確保命令內的全部引號成對出現
確保用花括號{}括起動做語句,用()括起條件語句
awk中NF指定的是域的個數,NR指定行數;$NF指定最後一個域的值;$NR指定依次打印一遍行列
匹配符~:爲使一域號匹配正則表達式,使用"~"後緊跟正則表達式,也可使用if語句.awk中if後面的條件用()括起來了。
例如:#awk '{if($4~/xxb/) print $0}'
# cat cat.ip | awk -F"|" '{if($2~/andy/) {print $0}}' 注意:分隔符仍是引住
# awk -F "|" '$2 ~ /xxb/' cat.ip 直接過濾查找
# awk -F"|" '$2 !~/xxb/' cat.ip 直接過濾非查找
# awk -F"|" '$2=(!)="xxb" {print $0}' cat.ip 使用精確(過濾)查找
# awk '{if($2>$3) print $0}' grade 判斷成績後進行輸出
# awk '{if($2>70) print $0}' grade
# awk '$1~/(xxb|yyy)/ ' grade 打印匹配(或)的整行(print $0)
# awk '{if($2>70 && $3>80) print $0}' grade 打印兩個成績並集(與)
awk內置變量:
NF:支持記錄域的個數,在記錄被讀以後設置
NR:顯示行數
FILENAME:顯示支持awk腳本實際操做的輸入文件名
RS:記錄分隔符,缺省爲新行(\n)
#awk '(t+=$4) {print $0}; END{print t}' grade 只打印一個最終值 END最終打印
#awk awk '(t+=$4) {print $0,t}' grade 這樣將在最後打印每一列的累加,最後再打印一次最終值
awk中內置的函數:
gsub(r,s) 在整個$0中用s代替r 相似於sed查找和替換
index(s,t) 返回s中字符串t的第一位置
length(s) 返回字符長度 # awk '{print $0,length()}' grade (其實也能夠寫在前面的)
match(s,r) 測試s是否包含匹配r的字符串
sub(r,s) 用$0中最左邊最長的子串代替s
substr(s,p) 返回字符串s中從p開始的後綴部分
#awk '{print $0,substr($1,1,2)}' grade 打印$1列的從第1個字符開始打印2個長度
#awk '{print $0,substr($1,1)}' grade 打印$1列所有,2減去首字母,3減去兩個
my.oschina.net/xxbAndy/blog