sed和awk之sed篇(含sed高級用法)
(原創文章,謝絕轉載~)
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高級用法)