shell中的正則表達式、sed、awk

 

本文主要說一些正則的基本語法,並且結合linux的各種小工具(egrep、sed、awk)列舉一些使用實例。

 

一、基本語法

正則的基本語法就大概是下面這些,但是正則遠不止這些,甚至可以寫一本書,當然了,我們這裏只列舉一些簡單的

用法,這些已經可以解決大部分實際問題了。


1、字符類

字符 含義 舉例
. 匹配任意一個字符
abc. 可 以匹配abcdabc9
[] 匹配括號中的任意一個字符
[abc]d 可以匹配adbdcd
- 用在[]中,表示字符範圍
[0-9a-fA-F] 可以匹配一位十六進制數字
^ 如果位於[]的開頭,則匹配除去括號中字符之外的一切字符
[^xy] 匹配除xy 之外的任一字符,因此[^xy]1 可以 匹配a1b1 但不匹配x1y1
[[:xxx:]] grep 工 具預定義的一些命名字符類 [[:alpha:]] 匹配一個字母,[[:digit:]] 匹配一個數字


2、數量限定符

字符 含義 舉例
? 緊跟在它前面的單元匹配零次或一次
[0-9]?/.[0-9] 匹配0.02.3.5 等,由於. 在正則表達式中是一個特殊字符,所以需要用/ 轉 義一下,取字面值
+ 緊跟在它前面的單元匹配一次或多次
[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+/.[a-zA-Z0-9.-_]匹配email
* 緊跟在它前面的單元匹配零次或多次
[0-9][0-9]* 匹配至少一位數字,等價於[0-9]+[a-zA-Z_]+[a-zA-Z_0-9]* 匹 配C語言的標識符
{N} 緊跟在它前 面的單元應精確匹配N次 [1-9][0-9]{2} 匹 配從100999 的整數
{N,} 緊跟在它前面的單元至少要匹配n次
[1-9][0-9]{2,} 匹配三位以上(含三位)的整數
{,M} 緊跟在它前面的單元至多匹配m次
[0-9]{,1}和[0-9]?意義一樣,
{N,M} 緊跟在它前面的單元至少匹配n次,至多匹配m次
[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.[0-9]{1,3}/.用於匹配ip地址


3、位置限定符

字符 含義 舉例
^ 匹配行首的位置 ^content匹配以content開頭的行
$ 匹配行末的位置 :$匹配以:結尾的行,^$匹配空行
/< 匹配單詞開頭的位 置 /<th 匹配... this ,但不匹配ethernettenth
/> 匹 配單詞結尾的位置 p/> 匹配leap ... ,但不匹配parentsleepy
/b 匹 配單詞開頭或結尾的位置 ap/b匹配leap,/ble匹配leap,/bat/b 匹配... at ... ,但不匹配catatexitbatch
/B 匹配非單詞開頭和結尾的位置 /Bat/B 匹配battery ,但不匹配... attendhat ...

 

4、其他特殊字符

字符 含義 舉例
/ 轉義字符,普通字符轉義爲特殊字符,特殊字符轉義爲普通字符 普 通字符< 寫成/< 表 示單詞開頭的位置,特殊字符. 寫成/. 以 及/ 寫成// 就當作普通字符來 匹配
() 將正則表達式的一部分括起 來組成一個單元,可以對整個單元使用數量限定符 ([0-9]{1,3}/.){3}[0-9]{1,3} 匹 配IP地址
| 連接兩個表達式,表示或的關係
n[o-either]可以匹配no或neither

 

 

二、小工具


1、grep/egrep

grep 是一種查找過濾工具,正則表達式在grep 中 用來查找符合模式的字符串。

egrep相當於grep -E,表示採用Extended正則表達式語法。grep的正則表達式有Basic和 Extended兩種規範

上述列舉的正則表達式語法都適用於egrep。而grep的語法則相對簡陋一些,?+(){}|都只是一些匹配字符了。

 

2、sed

sed意爲流編輯器(Stream Editor),在Shell腳本和Makefile中作爲過濾器使用非常普遍,也就是把前一個程序的輸出引入sed的輸入,經過一系列編輯命令轉換爲另一種格式輸出。sed和vi都源於早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。

 

在正常情況下,sed將待處理的行讀入模式空間,腳本中的命令就一條接着一條的對該行進行處理,直到腳本執行完畢,然後該行被輸出,模式空間清空;然後重複剛纔的動作,文件中的新的一行被讀入,直到文件處理完備。

 

看了很多寫sed的就屬鳥哥寫的最好了,摘錄一下:






不過鳥哥的不是很全,特補充如下:


  • n和p一起使用:$ sed -n 's/^test/mytest/p' 
    
    example
    (-n)選項和p標誌一起使用表示只打印那些發生替換的行。也就是說,如果某一行開頭的test被替換成mytest,就打印

    它。

  • 引用:$ sed 's/^192.168.0.1/&localhost/' example-----&符號表示替換換字符串中被找到的部份。所有以192.168.0.1開頭的行都會被替換成它自已加 localhost,變成192.168.0.1localhost。
  • 引用:$ sed -n 's//(love/)able//1rs/p' example-----love被標記爲1,所有loveable會被替換成lovers,而且替換的行會被打印出來。
  • 分隔符:$ sed 's#10#100#g' example-----不論什麼字符,緊跟着s命令的都被認爲是新的分隔符,所以,“#”在這裏是分隔符,代替了默認的“/”分隔符。表示把所有10替 換成100。
  • 用正則表示範圍:$ sed -n '/test/,/check/p' example-----所有在模板test和check所確定的範圍內的行都被打印。
  • 正則和數字混用表示範圍:$ sed -n '5,/^test/p' example-----打印從第五行開始到第一個包含以test開始的行之間的所有行。
  • $ sed '/test/,/check/s/$/sed test/' example-----對於模板test和west之間的行,每行的末尾用字符串sed test替換。
  • 一次執行多條命令:$ sed -e '1,5d' -e 's/test/check/' example-----(-e)選項允許在同一行裏執行多條命令。如例子所示,第一條命令刪除1至5行,第二條命令用check替換test。命令的執 行順序對結果有影響。如果兩個命令都是替換命令,那麼第一個替換命令將影響第二個替換命令的結果。
  • 並不常用的一種用法:$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,則移動到匹配行的下一行,替換這一行的aa,變爲bb,並打印該行,然後繼續。
  • h命令和G命令: $ sed -e '/test/h' -e '$G‘ example-----在sed處理文件的時候,每一行都被保存在一個叫模式空間的臨時緩衝區中,除非行被刪除或者輸出被取消,否則所有被處理的行都將 打印在屏幕上。接着模式空間被清空,並存入新的一行等待處理。在這個例子裏,匹配test的行被找到後,將存入模式空間,h命令將其複製並存入一個稱爲保 持緩存區的特殊緩衝區內。第二條語句的意思是,當到達最後一行後,G命令取出保持緩衝區的行,然後把它放回模式空間中,且追加到現在已經存在於模式空間中 的行的末尾。在這個例子中就是追加到最後一行。簡單來說,任何包含test的行都被複制並追加到該文件的末尾。
  • 特殊字符"^"和"$"匹配的是模式空間的最開始與最末尾
  • n: 將模式空間中的內容輸出,然後把下一行讀入模式空間
  • sed '/test/{a;b;c}' 這個用法可以針對匹配test的行執行a、b、c這三天命令。
補充幾個除d、a、i、s、c、p之外不常用的命令:


  • h:拷貝模板塊的內容到內存中的緩衝區。
  • H:追加模板塊的內容到內存中的緩衝區
  • g:獲得內存緩衝區的內容,並替代當前模板塊中的文本。
  • G:獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。sed G可以在每一行後面添加一個空白行,這是因爲當前內存緩衝區爲空,每次都把緩衝區的空內容添加到了每一行後面。
  • sed '/^$/d;G':用分號分隔多條命令,每一條命令都會作用在當前行上。

更多用法可以參考:

http://sed.sourceforge.net/sed1line_zh-CN.html

http://blog.chinaunix.net/u2/89923/showart_2206200.html

http://www.tsnc.edu.cn/default/tsnc_wgrj/doc/sed.htm

 

3、awk

待續。。。。。。。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章