2014年11月18日 星期二

awk sed 入門

參考  http://www.delightpress.com.tw/bookRead/skns00004_read.pdf
參考  http://wanggen.myweb.hinet.net/ach3/ach3.html

sed 和 awk 共通的運作方式是:只要符合「樣式」的資料列,就對它執行指定的「動作」。因此,瞭解樣式的基本語法,運用 sed 和 awk 才能得心應手。

所以你必須透徹了解正規表示式:

正規表示式

符號代表的條件敘述, 滿足條件才是符合「樣式」


. 一點代表一個字元
^ 在列首
$ 在尾部
[...] 字元集合  ###  Ex. [A-Z] A到Z之間任一字元 ; [ABc] A, B, c三者之間任一字元
* 出現 0 個以上
\{...\} 指定符合的個數  ### Ex. :\{3,5\} 表示前面的字元有 3 到 5 個。[a-z]\{3,5\}代表以小寫字母組成的字串,長度是 3~5。


awk

像是if(...) {...} , 符合條件時會執行指定動作

awk 為一直譯語言(Interpreter),大量引用 C 語言的語法,取 C 語言對文字處理和輸出格式的精華,再加上支援原始 C 語言所沒有的對正規表示法的匹配和關聯矩陣(Associative Arrays)的支援。

因此 awk 和 C 語言應用上最大的差別為 C 語言指令和語法多而複雜,而 awk 小而精簡,用來處理和計算用文字記錄的資料和文字的排版。
1980 年代 awk 曾很流行,一直到約 1990 才逐漸被另一通用的直譯語言 Perl 所瓜分。

以下是 awk 常用的作用格式:
  • awk「樣式」檔案:把符合樣式的資料列顯示出來。 
  • awk '{動作}' 檔案:對每一列都執行{}中的動作。 
  • awk '樣式{動作}' 檔案:對符合樣式的資料列,執行{}中的動作。


sed

sed 的動作為一次只讀一行並去掉結尾的換行到暫時的緩衝區(buffer)中,此暫時緩衝區稱為〝pattern space〞,接著處理完成後會把 pattern space 的內容送往螢幕後清空 pattern space 再去處理下一行,這樣不斷重複直到檔案結束。

sed 每個參數之間預設分隔符號(delimiter)是用〝/〞來區別如 sed 's/OLD/NEW/g' flie,但如要搜尋樣板有〝/〞會和分隔符號混在一起如再加上跳脫字元〝\〞會變得好像火星文看不懂。

例如要把 Linux 路徑〝/abc/wxy〞改為 WINDOWS 路徑表示法的〝\abc\wxy〞,sed 的寫法為 sed 's/\//\\/g' ,真的不易一眼看出什麼是什麼,

故 sed 可用除空白,換行以外的字元(英文字母或數字或符號皆可)來當分隔符號,只要前後一致即可。
$ echo 'this is a apple' | sed 's:a:AN:' <- 將〝a〞改為〝AN〞(用〝:〞當 delimiter)
this is AN apple
$ echo '/home/frank/' | sed 's#/#\\#g' <- 將〝/〞改為〝\〞(用〝#〞當 delimiter)
\home\frank\

要連續執行多個處理, [COMMAND]用 -e
Ex.
$ sed -e 's/a/A/' -e '/this/ q' -e 'l' MyFile <- 多個 sed CMD 要使用,就一定要用〝-e〞


大量改檔名

http://eric0703.pentaxfans.net/2285


沒有留言:

張貼留言