2014年8月31日 星期日

[Linux] Sed 與 awk 指令

Sed 與 awk兩者都是管線命令。但sed常用於一整行的處理,awk則傾向於在一行當中,分成數個區塊處理。

sed

sed 可將資料進行取代、刪除或是擷取特定行。

sed [-nefi] [動作]

-n  :使用安靜模式。一般來說,所有的資料都會被輸出至螢幕上。
         而在此模式下,只有經過sed處理後的那一行才會被列出來。
-e  :直接在指令列上進行sed的編輯。
-f   :直接將sed的動作寫入一個檔案內。
         如-f filename 就是可直接執行filename內的所記錄的sed動作。
-i   :直接修改讀取的檔案內容,而不由螢幕輸出。

動作說明:n1,n2 function
未必會存在,n1、n2一般代表選擇進行動作的行數。
例如動作只在10~20行間進行,則可寫成: 10,20 [funciton]

而funciton 的動作如下:
a :新增。  在a的後面可接字串,而這些字串會在新的一行出現
                     (目前的下一行)
c :取代。  在c的後面可接字串,而這些字串可取代在n1、n2之間的行。
d :刪除。  因為是刪除,後面通常不接東西。
i  : 插入。 可接字串,且字串會在新一行出現(目前的上一行)。
s : 取代。 可直接進行取代。
p : 列印。 可將選取的資料顯示於螢幕上,通常會搭配參數 -n 一起使用。
                    若不加上參數 -n ,則代表將選取資料重複顯示一次。
Example:
nl /etc/passwd | sed '2,5d'
此行是將/etc/passwd 的內容列出,並將第2行至第5行刪除。
須注意在sed後所接的指令須以單引號包住。

nl /etc/passwd | sed '2,$d'
此行則是表示將第二行至最後一行的內容刪除。
$ 表示最後一行。

nl /etc/passwd | sed '2a Drink tea or ....\ drink beer? '
此行表示在第2行後新增內容。(在第二行的下一行)
而在此則是加入兩行文字。以 " \ " 表示換行。

nl /etc/passwd | sed '2,5c No 2-5 number'
此行表示在第2行至第5行間以後面字串取代。
因此第二行到第五行的內容均會被刪除,
而以 "No 2-5 number" 這一行文字取代。
(若原本有五行的內容,如此取代後將只會剩下第1行與新增的那行。)

nl /etc/passwd | sed -n '5,7p'
此行表示將5-7行顯示於螢幕上,並且以安靜模式顯示。
因此在螢幕上只會出現5-7行。
若僅輸入 sed '5-7p',則會將5-7行重複輸出一次。
(因此假設原始資料有10行,且5-7行被重複輸出,故共有13行)
透過導出符號,即可將挑選出的資料儲存成新檔案。

sed 's/欲取代的字串/新的字串/g'
如此可進行取代。

cat /etc/man.config | grep 'MAN' | sed 's/#.*$//g' | sed '/^$/d'
此行首先先將/etc/man.config中含有MAN字串的行取出。
再將含有#的註解行以空白取代。
最後在搜尋空白行(^$,字首為$的行),並刪除之。

sed -i '$a # This is test' regular.txt
此行可在文字檔regular.txt中,直接進行修改。
由於 $ 代表最後一行,而a的動作是新增
因此表示在此文字檔的最後一行新增輸入文字。



沒有留言:

張貼留言