三個支持正則表達式的行處理的工具: grep/sed/awk
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]
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