1. 程式人生 > >三個支持正則表達式的行處理的工具: grep/sed/awk

三個支持正則表達式的行處理的工具: grep/sed/awk

刪除 全局替換 display nds 裏的 控制 streams 入行 arch

grep:

全稱Global Regular Expression Print, 是幹什麽的,不多說了;

用法:grep 【-options] [pattern】 【filename]

選項:

-c: 只輸出匹配行的數目
-i: 不區分大小寫
-n:顯示匹配航以及行號
-l:查詢多文件的時候只輸出包含匹配字符的文件名
-L: 列出不匹配的文件名;
-v:反向匹配,即顯示不匹配的行
-h: 查詢的時候不適用文件名
-s:不顯示錯誤信息 
-E 使用擴展正則表達式        //很有用啊,
-A :後跟一個數字(有無空格都可以),例如 –A2則表示打印符合要求的行以及下面兩行

-B :後跟一個數字,例如 –B2 則表示打印符合要求的行以及上面兩行

-C :後跟一個數字,例如 –C2 則表示打印符合要求的行以及上下各兩行

pattern:

指的正則表達式;用雙引號“”或單引號‘’引用起來;

例子:

int main() {
    printf int
    iostreamsd print include interfaces j
    int a = 0, i;
int. main() {
    printf("hello,world!\n");
    for(i=0; i<10; i++)
.        a = a + i;
    return 0;
}

匹配括號裏的內容:

[email protected]
/* */:~/play$ grep -nE "\(.+\)" hello.c 7: printf("hello,world!\n"); 8: for(i=0; i<10; i++)

sed 的用法:(來自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2856901.html)

sed 是一種在線編輯器,它一次處理一行內容;它也可以處理 正則表達式(其中用//來把正則表達式括起來);下面為它的用法:

sed 【參數】 【動作】 文件

參數:

-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)才會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯; -f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作; -r :sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法) -i :直接修改讀取的文件內容,而不是輸出到終端。

動作:

a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因為是刪除啊,所以 d 後面通常不接任何咚咚;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

補充:(來自:http://blog.csdn.net/wh_19910525/article/details/7613090)

 a\    在當前行後添加一行或多行。多行時除最後一行外,每行末尾需用“\”續行
 c\    用此符號後的新文本替換當前行中的文本。多行時除最後一行外,每行末尾需用"\"續行
 i\    在當前行之前插入文本。多行時除最後一行外,每行末尾需用"\"續行
 d     刪除行
 h     把模式空間裏的內容復制到暫存緩沖區
 H     把模式空間裏的內容追加到暫存緩沖區
 g     把暫存緩沖區裏的內容復制到模式空間,覆蓋原有的內容
 G     把暫存緩沖區的內容追加到模式空間裏,追加在原有內容的後面
 l     列出非打印字符
 p     打印行
 n     讀入下一輸入行,並從下一條命令而不是第一條命令開始對其的處理
 q     結束或退出sed
 r     從文件中讀取輸入行
 !     對所選行以外的所有行應用命令
 s     用一個字符串替換另一個
 g     在行內進行全局替換
      
 w     將所選的行寫入文件
 x     交換暫存緩沖區與模式空間的內容
 y     將字符替換為另一字符(不能對正則表達式使用y命令)

舉例子:

sed 1a\shabi‘ hello.c                 //在第一行後面增加一行;
sed 1,4d hello.c                        // 把第一行至第四行刪除;
sed -nr /^int/p hello.c                            // 把開頭為int的行打印出來;
sed -nr /^[^int]/p hello.c                            // 把開頭不是int的行打印出來;

sed 1,20s/int/sb/g hello.c                    // 把第一行到第20行中的int換為sb;
 
//多個命令用{}括起來,並用 ; 分開;
如:
sed -n /int/{s/int/char/g;p} hello.c              //把含有 int 的行 換為 char 並打印出來;

AWK更牛逼:

它可以把文件逐行讀入,心空格或其它指定的分隔符將每一行切片,切開的部分再進行各種分析處理;

如何調用 awk?(來自:http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html)

三個方法:1, 命令行形式;也是下面要講的形式;

2. shell 腳本方式, 與bash 一樣的道理;

3. 將所有命令寫入到一個單獨的文件,然後調用 awk –f awk-script-file input-file, 我覺得這個方式與 shell 腳本形式差不多啊;

awk的工作原理:(來自:http://man.linuxde.net/awk)

awk BEGIN{ commands } pattern{ commands } END{ commands }
第一步:執行BEGIN{ commands }語句塊中的語句; 
第二步:從文件或標準輸入(stdin)讀取一行,然後執行pattern{ commands }語句塊,它逐行掃描文件,從第一行到最後一行重復這個過程,直到文件全部被讀取完畢。 
第三步:當讀至輸入流末尾時,執行END{ commands }語句塊。

說明:

BEGIN語句塊在awk開始從輸入流中讀取行之前被執行,這是一個可選的語句塊,比如變量初始化、打印輸出表格的表頭等語句通常可以寫在BEGIN語句塊中。

END語句塊在awk從輸入流中讀取完所有的行之後即被執行,比如打印所有行的分析結果這類信息匯總都是在END語句塊中完成,它也是一個可選語句塊。

pattern語句塊中的通用命令是最重要的部分,它也是可選的。如果沒有提供pattern語句塊,則默認執行{ print },即打印每一個讀取到的行,awk讀取的每一行都會執行該語句塊。(把Pattern當作一個條件比較好理解;)

預備知識1:內置變量 (下面內容參考自:http://www.zsythink.net/archives/tag/awk/)

技術分享

另外: $0,表示整個條記錄; $1表示當前行的第一個域,$2表示當前行的第二個域

預備知識2: 模式各類;(下面內容參考自:http://www.zsythink.net/archives/tag/awk/)

  • 空模式:就是空的,沒有 ,任何行都滿足這個模式;
  • 關系模式:就是指的符合關系運算符的模式;如下所示:

技術分享

  • 正則表達式模式: 說明兩點,1. 用 // 把正則表達式括起來;2. 它使用的為擴展的正則表達式,當使用{x,y}這種次數匹配時,需要加上參數 –posix或 –re-interval;
  • 行範圍模式 :舉個例子說明:
    // 用正則表達式來指定行的範圍,(註意:都以第一次匹配的行為準)
    awk /正則1/,/正則2/{動作}  hello.c
    
    //當單純地使用行號時,應該使用 NR變量;
    awk -F : NR>=3&&NR<=6{printf("%s@%s\n"), $1,$2} passwd
  • BEGIN和END模式; 不多說,上面已經說明;

說明:可以多個模式並列的;pattern省略與為1,等價於/.*/;action省略,等價於 print; 很有用的;

awk的打印命令:

print函數:print函數的參數可以是變量、數值或者字符串。字符串必須用雙引號引用,參數用逗號分隔。如果沒有逗號,參數就串聯在一起而無法區分。這裏,逗號的作用與輸出文件的分隔符的作用是一樣的,只是後者是空格而已。 說明一點:當兩個打印的變量想用內容連接時,使用“內容”。

// 例子:

[email protected]:~/play$ echo "hello" | awk BEGIN{a="xiaoming";b="xiaohong"} {print a ,b}
xiaoming xiaohong
[email protected]:~/play$ echo "hello" | awk BEGIN{a="xiaoming";b="xiaohong"} {print a"@"b}
[email protected]

printf函數:其用法和C語言的差不多,可以格式化輸出;不多說;

awk的動作命令:(下面內容參考自:http://www.zsythink.net/archives/tag/awk/)

1. 它的動作命令用{}括起來; 多個命令之間用;分開,如{print $1; print $2}

2. {}裏面可以放入一起C語言的控制語句,如判斷、循環等;

awk的使用:

參數:-F ,指定輸分隔符,分隔符用’’引起來;如: awk –F ‘:’ ;

好,先到這裏吧;

三個支持正則表達式的行處理的工具: grep/sed/awk