1. 程式人生 > >sed和awk之sed篇(含sed高級用法)

sed和awk之sed篇(含sed高級用法)

清空 pre 需要 amp 打印 多條 邏輯 help n)

(原創文章,謝絕轉載~)

sed(stream editor)和 awk 是linux環境下處理文本、數據的強大“利器”,sed對數據列的處理稍遜,awk則更似一門語言,control flow的語法基本和c語言一樣,能夠處理復雜的邏輯,二者經常配合正則表達式使用。本文簡述sed用法。

sed對輸入流(文本數據)逐行處理,其基本格式為:

sed (OPTIONS...)  [SCRIPT] [INPUTFILE...]
#examples
sed ‘10d‘ test.txt
sed -i ‘s/a/b/‘ test.txt

options 有常用的:-n(消除自動打印),-i (edited in-place),-e(--expression=script),-f (--file=script-file),--help 等。

sed的script部分的格式為:

(addr)X(options)

其中addr(address)部分我們可以指定處理某些行,若無指定,則sed將處理數據流中的所有行。

X為 sed 的命令,(options) 對某些sed 命令使用,sed 的常用命令有:d(刪除),p(打印),l(unambiguous打印),s(替換),i(插入文本)等等。

其中替換是最為常用的命令之一,它的格式為:

s/regexp/replacement/(flags)
#examples
sed ‘s/string/repalce/‘ test.txt
sed ‘s/^start_this/repalce/g‘ test.txt

其中g是最常用的flags,它的作用是替換所有匹配到的正則式,而非第一個(不加g時)。

sed 亦可以使用多條命令:

sed ‘1d
2d
3d‘

sed -e 1d -e 2d -e 3d

sed ‘1d;2d;3d‘

如上有多種方式執行多條命令,但需註意,用分號將命令隔開不適用於某些特殊的命令(a,c,i等),因為這些命令會將分號也視為文本而不是命令間的間隔。

接下來將說下 addr的用法,即指定行,指定行的方法有如下:

#單個數字指定,例如打印第2行
sed -n ‘2p‘
#fisrt~step,例如如下打印1,4,7,10,,,行(step為公差)
sed -n ‘1~3p‘
#正則篩選,例如如下打印end結尾行
sed -n ‘/end$/p‘  
#範圍(閉區間),範圍間用逗號分隔,如下為打印2到8行
sed -n ‘2,8p‘
#範圍配合正則使用,如下為打印2到匹配到正則那行
sed -n ‘2,/regexp/p‘

sed的正則表達式不贅述,和一般正則差異不大,稍有syntax調整,且regexp1\|regexp2 時也是從左至右優先。

下面說下sed的高級用法:

首先需要理解下sed的運行機制,sed具有兩個數據緩存區,一個所謂pattern區,一個所謂hold區,一行數據過來在pattern區執行sed處理命令,然後默認輸出pattern區的內容(除非 -n 消除自動打印),然後會清空pattern區(默認),進行下一行數據操作(下一次循環)。hold區可以在循環間保持住本區數據不刪除,sed的一些命令可以在pattern區和hold區之間move data。

D: 刪除pattern區數據直到第一個newline, 重啟循環(此時不會清空pattern區數據)

G: 將hold區數據加到pattern區, 加之前加上newline(\n)

H: 將pattern區數據加到hold區,加之前加上newline(\n)

N: 輸入流再加一行到pattern區,加之前加上newline(\n)

P: 打印pattern區數據,直到第一個newline(\n)

h: pattern區的數據替換hold區的數據

看具體例子:

[email protected]:~$ seq 5 |sed -n ‘N;l;D‘
1\n2$
2\n3$
3\n4$
4\n5$

N加上了\n和第二行2,於是打印出 1\n2$ ,再D刪除掉 1和\n,pattern區於是剩下 2

如此繼續,N加上了\n和第三行3,於是打印出 2\n3$ ,再D刪除2和\n,pattern區剩下3。後面如前所述。

再如例子:文本按行倒序打印:

[email protected]:~$ seq 5 |sed -n ‘1!G;$p;h‘
5
4
3
2
1

第一行數據不執行G操作,不打印($p只打印最後一行輸入),進入hold區(h操作),此時hold區數據為1

第二行數據2進入,將hold區數據1加入pattern區(G功能),此時pattern區為 2\n1,再轉到hold區,此時hold區數據為 2\n1

第三行數據3進入,再將hold區 2\n1加入pattern區(G功能),此時pattern區為 3\n2\n1,再轉到hold區,此時hold區數據為3\n2\n1

如此,最後一行結束時,打印出pattern區數據為上圖倒序所示。

未完待續,後續將總結另一利器awk的處理數據列方面的用法~

sed和awk之sed篇(含sed高級用法)