Linux 伺服器系統管理第十二章 Sed 與 awk 處理工具      下一頁

第十二章 Sed Awk 處理工具

內容:

12-1 串流編輯器 – sed

12-1-1 Sed 運作程序

串流編輯器(Stream edit, sed如同 vi(或 vim)一樣,都是文件編輯工具,編輯命令也幾乎是相同的。但兩者最大的不同點是,vi 屬於交談式的作業方式,而 sed 是批次處理模式。圖 12-1 sed 的文件編輯模式,文件由檔案起頭開始,依序進入 sed 文件編輯器,另外在 sed 命令上設定有若干的編輯命令。當檔案文件依序進入 sed 命令時, sed則會比較該文件是否有符合編輯條件,如果符合則編輯其內容,如不符合則依序讓文件通過;如此一來,文件就如同串流方式通過 sed 編輯器,並依序輸出編輯後的成果。

 

12-1 sed 命令運作模式

12-1-2 sed 命令格式

Sed 如同一般命令,可在提示符號下直接輸入編輯,格式如下:

$ sed [option] ‘instruction’ file

上述命令中包含了三個主要部分,第一者為選項(option),它供選擇 sed 的運作模式;第二部分利用兩個單引號包起來的編輯命令(如 ‘instruction’),幾乎所有 vi 環境底下的編輯命令,這裡都可以使用;第三部分為串流輸入給 sed 命令編輯的檔案名稱。如果沒有輸出轉向的話(如 > file_final),則編輯結果將直接顯示於終端機螢幕上。

(A) 【常用選項】

sed 命令的常用選項有:

Ø  -e當同一命令行有多個編輯命令的話,則利用 –e 表示後面緊接著一個編輯命令。

Ø  -f script:可將編輯命令書寫成一個 script 檔案,並利用 –f 表示之。

Ø  -n:抑制輸入列的自動輸出。

(B) 【編輯命令】

無論 sed vi 的編輯命令,幾乎都與 sed 相容,常用編輯命令有:

²  aappend:位置之後插入文字。如:‘1, 3a \good’,在第一與第三行之後插入 good 文字。

²  iinsert:位置之前插入文字。如:’1, 2i \good’,在第一與第二行之前插入 good 文字。

²  cchange:以文字取代指定範圍。如:’1, 2c \Good’,則表示第一與第二行,由 Good 文字取代。

²  ddelete:刪除範圍。如:’1, 2d’,表示刪除第一與第二行。

²  ssubstitute:範圍內尋找字串並置換另一字串。如:’1, 2s/Good/Text/’,在第一與第二行內尋找 Good 字串,並以 Text 字串替換它。

²  pprint:列印範圍。如:’1, 2p’,表示印出第一與第二行。

²  qquit:離開程式。

²  rread:讀取檔案。如:’20 r file1’,讀入 file1 檔案內容,並置入於 20 行之前。

²  wwrite:寫入檔案。如:’1, 4 w file1’,將第一到第四行內容,寫入到 file1 檔案內。

以下分別說明各編輯命令的使用方法。

12-1-3 sed 替換命令

替換命令的運作模式,首先搜尋文件中某一特定文字(或稱圖樣),再將它替換成另一段文字(或圖樣),命令格式如下:

‘[address]s/pattern/replacement/flags’

語法說明如下:

Ø  address:指定命令所處理對應的是哪幾列,如 1, 3 則表示由第 1 到第 3 列,如未指定則由搜尋 pattern 結果而定。

Ø  s:表示替換(substitution)命命。

Ø  pattern:所欲替換的原始圖樣(或文字),可利用正規式表示某一共通圖樣的格式。

Ø  replacement:替換後的新文字。

Ø  flags:是用來修飾替換命令,可能出現的有:

n  n:一個數字(1 ~ 512),表示只當第 n 次出現該圖樣時,才進行替換的動作。

n  g:表示對圖樣空間(pattern space)中出現的所有圖樣,都會進行替換的動作;如沒有指定 g,則只會處理第一次出現的圖樣。

n  p:印出圖樣空間的內容。

n  w file_name:將圖樣空間的內容寫入檔案內。

上述各種選項中,如果沒有指定範圍,則表示處理整個檔案內容。

A. 替換範例一】

RedHat 檔案(可到 www.redhat.com 網站複製練習)內 Red Hat 字樣,替換成 RED HAT,操作範例如下:

$ cat RedHat

The Fedora Project is a Red Hat sponsored and community-supported

open source project. It is not a supported product of Red Hat, Inc.

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

 

$ sed 's/Red Hat/RED HAT/' RedHat

The Fedora Project is a RED HAT sponsored and community-supported

open source project. It is not a supported product of RED HAT, Inc.

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

B. 替換範例二】

重複上一個範例,但僅搜尋處理第一行,操作範例如下:

$ sed '1 s/Red Hat/RAD HAT/' RedHat

The Fedora Project is a RAD HAT sponsored and community-supported

open source project. It is not a supported product of Red Hat, Inc.

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

12-1-4 sed 刪除命令

刪除文件內某一段內容如同 vi 命令的 d dd,是刪除某一行的意思;sed 有兩種方法來尋找所欲刪除的行,一者為直接表示刪除哪幾行的行號或範圍;另一者為搜尋符合條件的內容,如果符合的話則刪除該行的所有內容。命令格式如下:

‘[address]d’

‘/pettern/d’

其中,address 表示刪除某一行的行號,或某幾行的範圍;pattern 為搜尋的圖樣,可利用正規式表示。

A. 刪除範例一】

我們利用 RedHat_1 檔案作為以下 sed 刪除命令的輸入範例;第一個範例是刪除檔案內第 23 行,操作範例如下:

[tsnien@Linux-1 tools]$ cat HatRed_1

The Fedora Project is a Red Hat sponsored and community-supported

 

open source project. It is not a supported product of Red Hat, Inc.

 

The goal? Work with the Linux community to build a complete,

 

general purpose operating system exclusively from free software.

 

[tsnien@Linux-1 tools]$ sed '2, 4d' HatRed_1

The Fedora Project is a Red Hat sponsored and community-supported

The goal? Work with the Linux community to build a complete,

 

general purpose operating system exclusively from free software.

 

B. 刪除範例二】

刪除 RedHat_1 檔案內的空白行,其刪除命令為 ‘/^$/d’,其中 ^ 表示行的開頭、$ 為行的結束位置,如果行的起頭與結束之間沒有任何字元的話,則表示該行為空白行。因此,此命令的意思是,只要找到某一空白行,便將該行刪除;操作如下:

[tsnien@Linux-1 tools]$ sed '/^$/d' HatRed_1

The Fedora Project is a Red Hat sponsored and community-supported

open source project. It is not a supported product of Red Hat, Inc.

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

C. 刪除範例三】

刪除 RedHat_1 檔案內空白行與有 Red 字元的行,操作如下:

[tsnien@Linux-1 tools]$ sed -e '/Red/d' -e '/^$/d' HatRed_1

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

12-1-5 sed 插入/附加/變更命令

插入、附加與變更命令都是以『行』為執行對象,插入(insert)則表示在搜尋到的行之前一行,插入某一行文字;然而附加(append)則將文字放在所搜尋行的下一行;變更(change)則將所蒐尋的行,以另一行文字取代。命令格式如下:

附加:’[line-address]a\text’

插入:’[Line-address]i\text’

變更:’[address]c\text

A. 插入範例一】

Big 字元插入 RedHat 檔案內有出現 Red 字元的行之前一行,操作如下:

[tsnien@Linux-1 tools]$ sed '/Red/i\Big' RedHat

Big

The Fedora Project is a Red Hat sponsored and community-supported

Big

open source project. It is not a supported product of Red Hat, Inc.

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

B. 附加範例一】

重複上述範例,但附加是插入指定行的下一行,操作如下:

tsnien@Linux-1 tools]$ sed '/Red/a\Big' RedHat

The Fedora Project is a Red Hat sponsored and community-supported

Big

open source project. It is not a supported product of Red Hat, Inc.

Big

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

C. 附加範例二】

file_1 檔案內容附加到 RedHat 檔案內的第二行後面,操作如下:

[tsnien@Linux-1 tools]$ cat file_1

Is this a book?

Yes, this is a book

[tsnien@Linux-1 tools]$ sed '2r file_1' RedHat

The Fedora Project is a Red Hat sponsored and community-supported

open source project. It is not a supported product of Red Hat, Inc.

Is this a book?

Yes, this is a book

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

上述範例是讀入 file_1 檔案並附加在 RedHat 檔案的第二行後面。

D. 變更範例一】

RedHat 檔案內有出現 Hat 的行,以 New-Fedora 字元取代該行,操作範例如下:

[tsnien@Linux-1 tools]$ sed '/Hat/c\New-Fedora' RedHat

New-Fedora

New-Fedora

The goal? Work with the Linux community to build a complete,

general purpose operating system exclusively from free software.

12-1-6 sed 列印命令

搜尋或指定列印檔案內某些行的內容,命令格式如下:

-n ‘[address]p’

A. 列印範例一】

印出 RedHat 檔案內的第 23 行的內容。操作如下:

[tsnien@Linux-1 tools]$ sed -n '2, 3p' RedHat

open source project. It is not a supported product of Red Hat, Inc.

The goal? Work with the Linux community to build a complete,

C. 列印範例二】

印出 RedHat 檔案內有出現 Linux 字樣的行,操作如下:

[tsnien@Linux-1 tools]$ sed -n '/Linux/p' RedHat

The goal? Work with the Linux community to build a complete,

 

翻轉工作室:粘添壽

 

Linux 伺服器系統管理 - CentOS:

 

 

 

翻轉電子書系列: