正则表达式shell
http://blog.chinaunix.net/uid-26707720-id-3084204.html
正則表達式介紹
?????????使用s h e l l時,從一個文件中抽取多于一個字符串將會很麻煩。例如,在一個文本中抽取一個詞,它的頭兩個字符是大寫的,后面緊跟四個數字。如果不使用某種正則表達式,在s h e l l中將不能實現這個操作。
?????????正則表達式是一種可以用于模式匹配和替換的強大工具,我們可以在很多unix程序中找到正則表達式的身影,例如vi,perl,php,awk,sed,emacs,grep等。
?????????正則表達式常見的應用場合:
1.?????????驗證用戶輸入是否合法,如驗證?“xxx@xxx.xxx”的規則,其中x字符是字母,數字,下劃線,小數點或減號,郵件地址的每一部分可以有一個或多個字符。
2.?????????驗證IP地址是否符合“yyy.yyy.yyy.yyy”的規則,且每個地址段小于255
3.?????????……
基本元字符集及其含義
| ^ | 只匹配行首 |
| $ | 只匹配行尾 |
| * | 一個單字符后緊跟*,匹配0個或多個此單字符 |
| [] | 匹配[ ]內字符。可以是一個單字符,也可以是字符序列。可以使用-表示[ ]內字符序列范圍,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ] |
| \ | 只用來屏蔽一個元字符的特殊含義。因為有時在shell中一些元字符有特殊含義。\可以使其失去應有意義 |
| . | ?只匹配任意單字符 |
| p a t t e r n \ { n \ } | 只用來匹配前面p a t t e r n出現次數。n為次數 |
| p a t t e r n \ { n,\ } | 含義同上,但次數最少為n |
| p a t t e r n \ { n,m \ } | 含義同上,但p a t t e r n出現次數在n與m之間 |
?
grep
???????相信grep是UNIX和LINUX中使用最廣泛的命令之一。grep(全局正則表達式版本)允許對文本文件進行模式查找。如果找到匹配模式,?grep打印包含模式的所有行。grep支持基本正則表達式,也支持其擴展集。grep有三種變形,即:
???????grep:標準grep命令,集中討論此格式。
???????egrep:擴展grep,支持基本及擴展的正則表達式,但不支持\ q模式范圍的應用,與之相對應的一些更加規范的模式,這里也不予討論。
???????fgrep:快速grep。允許查找字符串而不是一個模式。不要誤解單詞fast,實際上它與grep速度相當。
???????grep一般格式為:
???????grep [選項]?基本正則表達式?[文件]
???????這里基本正則表達式可為字符串。
???????在grep命令中輸入字符串參數時,最好將其用雙引號括起來。例如:“m y s t r i n g”。
???????這樣做有兩個原因:
?????????常用的grep選項有:
1.???????-c?只輸出匹配行的計數。
2.???????-i?不區分大小寫(只適用于單字符)。
3.???????-h?查詢多文件時不顯示文件名。
4.???????-l?查詢多文件時只輸出包含匹配字符的文件名。
5.???????-n?顯示匹配行及行號。
6.???????-s?不顯示不存在或無匹配文本的錯誤信息。
7.???????-v?顯示不包含匹配文本的所有行
???????查詢多個文件
如果要在當前目錄下所有.c文件中查找字符串“sort”,方法如下:
grep "sort" *.c
或在所有文件中查詢單詞“sort it”
grep "sort it" *
$ grep -c "12" data
grep返回數字4,意義是有4行包含字符串“12”。
現在顯示包含“12”字符串的4行文本:
???????行數
顯示滿足匹配模式的所有行行數:
grep??-n “13” data
顯示所有不包含13的各行:
grep??-v “13” data
grep??“13<tab>” data????
grep??-i “sept” data
?
???????模式范圍
指定查詢字符串的范圍
grep??“13[23]” data
???????不匹配行首
grep??“^[^12]” data
???????匹配大小寫
grep??“[Ss]ept” data
???????匹配任意字符
grep??“IBM…” data
???????使用grep匹配“與”或者“或”模式
加參數- E允許使用擴展模式匹配
grep??-E “1301|1303” data
???????匹配特殊字符
grep “\”” *
???????匹配IP地址
grep “\([0-9]\{1,3\}\.\)\{1,3\}[0-9]\{1,3\}” /etc/sysconfig/network-scripts/*
awk
???????awk命令,要格式化報文或從一個大的文本文件中抽取數據包。
???????整體來說,?a w k是所有s h e l l過濾工具中最難掌握
1.???????復雜的語法
2.???????含義不明確的錯誤提示信息。
???????調用awk
awk??|-F field-sperator | ‘command’ input-file(s)
如瀏覽像passwd這種以”:”分割的文件,需要指定選項:
???????awk -F: ‘command’ input-file
l???????域參數
編號(1)???生產日期(2)???產品名稱(3)???價格(4)
l???????抽取域
awk ‘{print $1}’ data.txt
???????awk?中的?print?命令把輸入文件中選擇的數據輸出。
???????當?awk?讀取文件的一行,根據指定的?輸入域分隔符?把行分開,?FS,awk?的一個環境變量。它被預先定義為一個或者多個空格或者制表符。
???????變量?$1, $2, $3, ..., $N?把輸入行的第一第二第三直到最后一個域保存起來。變量?$0把整行的值保存起來。在下面的圖片描述中,我們看到?df?命令輸出有6欄。
???????df | awk ‘{print $1 "\t\t" $5}’
???????打印第一列和第五列,中間用兩個Tab隔開
???????域分隔符,既不是一個單獨的字符也不是一個普通的表達式,是控制?awk?把一個輸入分割成幾個域。輸入記錄按分割定義進行字符順序掃描;域就是在相符的那些文字中間的那部分。
???????域分隔符代表內建的變量?FS。
???????域分隔符變量的值可以在?awk?程序中用賦值操作符?=?來改變。通常最好的執行時間是一開始也就是還沒有處理任何輸入的時候,因此第一個記錄就被隨合適的分隔符一起讀取。使用特殊的BEGIN?。
???????awk 'BEGIN { FS=":" } { print $1 "\t" $7 }' /etc/passwd
???????awk 'BEGIN { FS=":" } { printf "username:%s\t",$1;printf "home:%s\n",$7}' /etc/passwd
???????awk條件操作符
= =?等于
!=?不等于
<?小于
> =?大于等于
< =?小于等于
~?匹配正則表達式
!~?不匹配正則表達式
???????匹配:
awk ‘{if($3~/IBM/) print }’ data.txt
如果第3個域字段包含IBM字符,則打印
awk ‘$3==“IBM” {print $0}’ data.txt
awk ‘{if($1<“13”) print $0}’ data.txt
sed命令
???????s e d是一個非交互性文本流編輯器。它編輯文件或標準輸入導出的文本拷貝。標準輸入可能是來自鍵盤、文件重定向、字符串或變量,或者是一個管道的文本。
???????使用s e d實現的一個重要功能是在另一個系統中下載的文件中剔除控制字符
???????使用p(rint)顯示行
1.???????顯示指定行的內容
sed??-n '2p'??sed.txt
sed??-n '1,3p'??sed.txt
匹配字符串worried,并顯示此行的內容。格式/pattern/
sed??-n '/worried/'p sed.txt
?????????使用d刪除行
sed??'2d'??sed.txt?刪除sed.txt文件的第二行
sed??'2,$d'??sed.txt?刪除sed.txt文件第二行到末尾所有行
sed??'$d'??sed.txt??刪除sed.txt文件的最后一行
sed '/worried/'d sed.txt??刪除sed.txt文件中所有包含worried的行。
?
思考:?sed??'/^$/d'??sed.txt
?????????使用s替換字符(串)
??????sed??'s/test/sedtest/g' sed.txt??在整行范圍內把test替換為sedtest
??????sed??-n??'s/test/sedtest/p' sed.txt??(-n)選項和p標志一起使用表示只打印那些發生替換的行
總結
以上是生活随笔為你收集整理的正则表达式shell的全部內容,希望文章能夠幫你解決所遇到的問題。