玩轉Linux 神級工具 sed awk

2022-03-28 04:07:19 字數 4922 閱讀 2476

這裡是我在網上書上收集的相關資料,因為這兩個工具很有名也很重要,所以這些資料會幫助我更好的瞭解和熟悉它們。

在《sed and awk》一書中(1.2 a stream editor)的解釋是:

sed本質上是一個編輯器,但是它是非互動式的,這點與vim不同;同時它又是面向字元流的,輸入的字元流經過sed的處理後輸出。這兩個特性使得sed成為命令列下面非常有用的一個處理工具。

sed本身是一個管道命令,可以分析 standard input 的,主要是用來分析關鍵字的使用、統計等,此外還可以將資料進行替換、刪除、心中、選取特定行等功能。

sed命令的語法如下所示:

sed [-nefr] [動作]

引數說明:

-n : 使用安靜模式,一般所有來自stdin的資料會被列出到螢幕上,但是 -n 在可以只列出經過 sed 處理過的那一行。

-e : 直接在命令列模式上進行 sed 的動作編輯。

-f : 直接將 sed 的動作解除安裝一個檔案內, -f filename 則可以執行 filename 內的 sed 動作。

-r : sed 的動作支援的是擴充套件型正規表示式的語法(預設是基礎正規表示式語法)。

-i : 直接修改讀取的檔案內容,而不是由螢幕輸出。

動作說明: [n1],[n2] function

n1,n2:不見得會存在,一般代表選擇進行動作的行數。

舉例來說:如果我的動作是需要在 10 到 20 行之間進行的,則“10,20[動作行為]”

function 有下面這些引數:

c:替換,c 的後面可以接字串,這些字串可以替換n1,n2之間的行!

d:刪除,因為是刪除,所以 d 後面通常不接任何引數。

p:列印,也就是將某個選擇的資料列印出來,通常 p 會與引數 sed -n 一起執行。

s:替換,可以直接進行替換工作。通常這個 s 的動作可以匹配正規表示式!

例如:1,20s/old/new/g 就是。

以行為單位的新增或刪除功能

案例(一)

nl /etc/passwd | sed '2,5d'

說明:

注:$表示最後一行。

案例(二)

nl /etc/passwd | sed '2a drink tea'

說明:

注:2a 中的 a 是指第二行後面,而 2i 中的 i 則是指第二行的前面。

案例(三)

nl /etc/passwd | sed '2a drink tea or ......\

drink beer'

說明:

以行為單位的替換與顯示功能

案例(一)

nl /etc/passwd | sed '2, 5c no 2-5 number'

說明:

案例(二)

nl /etc/passwd | sed -n '5,7p'

說明:

案例(三)

sed 's/要被替換的內容/新的內容/g'

說明:

案例(四)

下面是記錄一次獲取ip資料的過程:

第一步:先檢視源資訊,利用 /sbin/ifconfig 查詢 ip。

/sbin/ifconfig eth0
注:我們的目的是要獲得ip資料,那麼先利用關鍵字找出那一行。

第二步:利用關鍵字配合 grep 選取出關鍵的一行資料。

/sbin/ifconfig eth0 | grep 'inet addr'

注:因為只需要ip資料,所以接下來就是把不需要的內容都刪掉,那麼就需要一個正規表示式來幫助實現:

^.*inet addr:
第三步:將 ip 前面的部分予以刪除

/sbin/ifconfig eth0 | grep 'inet addr' | \

sed 's/^.*inet addr://g'

注:上面的命令就把 ip 前面的資料刪掉了,那麼接下來就是把 ip 後面的資料也刪掉,此時的正規表示式則是:

bcast.*$
第四步:將 ip 後面的部分予以刪除

/sbin/ifconfig eth0 | grep 'inet addr' | \

sed 's/^.*inet addr://g' | sed 's/bcast.*$//g'

這樣就能把 ip 擷取出來了~~~

案例(五)

這裡主要是展示 sed 與正規表示式的配合使用。

假設我想在一個檔案(你自己新建或者已有的,主要是測試而已)獲取man字樣的那幾行資料,但是#在內的批註我不需要,而且空白行也不要。

第一步:先使用 grep 將關鍵字 man 所在行取出來。

cat /home/man.config | grep 'man'

第二步:刪除掉批註之後的資料。

cat /home/man.config | grep 'man' | sed 's/#.*$//g'

第三步:那麼接下來就是把空白行刪除掉。

cat /home/man.config | grep 'man' | sed 's/#.*$//g' | \

sed '/^$/d'

直接修改檔案內容(慎重)

首先要特別提醒的是,要練習 sed 修改檔案內容的時候不能用任何系統配置檔案,最好是自己新建一個測試文字來測試練習。

案例(一)

sed -i '/s\.$/\!/g' test.txt

說明:

案例(二)

sed -i '$a # this is a test' test.txt

說明:

簡單來說,awk 是一個資料處理工具。

相比於 sed 常常作用於一整行的處理,awk 則比較傾向於將一行分成數個“欄位”來處理。因此,awk 相當適合處理小型資料的資料處理。

對於程式語言來講,awk 是一種便於使用且表達能力強的程式設計語言,可應用於各種計算和資料處理任務。

基本語法

awk '條件型別1 條件型別2 ...' filename

last -n 5 // 僅取出登陸者的資料前五行(last 可以將登陸者的資料取出來)

如果我還要在這些資訊中取出:賬號與登陸者的ip,且賬號與ip之間以[tab]隔開,那麼可以這麼改命令:

last -n 5 | awk ''

上面是 awk 最常使用的動作,通過 print 的功能來講欄位的資料列出來,欄位的分割則以空格鍵或者[tab]按鍵來隔開。

上面的例子中,在每一行的每個欄位都是有變數名稱的,那就是$1,$2等變數名稱。

備註:$1 指的就是第一列,但是 $0 則是代表一整行(第一行)。

上面的例子中整個awk的處理流程:

(1)讀入第一行,並將第一行的資料填入$0,$1,$2等變數中;

(2)依據條件型別的限制,判斷是否需要進行後面的動作;

(3)昨晚所有的動作與條件型別;

(4)若還有後續的“行”的資料,則重複上面1~3的不知,直到所有的資料都讀完為止。

對於上面的案例指令 last -n 5 ... 來講,有幾點需要注意的:

注意: awk 後續的所有動作都是以單引號 “'” 括住的,由於單引號與雙引號都必須是成對的,所以 awk 的格式內容如查想要以 print 列印時,記得非變數的文字部分,包含一小節 printf 提到的格式中,都需要使用雙引號來定義出來,因為單引號已是 awk 的命令固定用法了。

last -n 5 | awk ''

awk 的運算子

值得關注的是那個等於 “==” 的符號,因為:

案例(一)

cat /etc/passwd | \

awk ' $3 < 10 '

說明:上面的指令執行的效果是查閱第三列小於10以下的資料,並且僅列出賬號與第三列。(在 /etc/passwd 當中是以冒號“:”來作為欄位的風,該檔案中第一欄位為賬號,第三欄位則是uid)

案例(二)

cat /etc/passwd | \

awk 'begin $3 < 10 '

說明:由於案例一中並沒有顯示出第一行的資料,那麼此命令則是把第一行也顯示出來了。利用 begin 關鍵字預先設定 awk 的變數。

案例(三)

此外 awk 還可以進行“計算功能”。

比如有一個檔案,內容如下:

name 1st 2nd 3th

小a 1000 1000 1000

小b 2000 2000 2000

小c 3000 3000 3000

那麼怎麼計算每個人的總額呢?而且還需要格式化輸出,那麼可以這樣思考:

cat test.txt | \

awk 'nr==1

nr>=2'

說明:

sed awk工具

sed意為流編輯器 stream editor ,在shell指令碼和makefile中作為過濾器使用非常普遍,也就是把前一個程式的輸出引入...