Linux學習-進階shell指令碼編程(二)初識sed和gawk,sedgawk
引文:有的時候,我們需要自動處理文字檔中的文本,而不需要拉出全副武裝的互動式文字編輯器。這種情況下,有個能夠自動地格式化、插入、修改或刪除文本元素的命令列編輯器就方便多了。
幸運的是Linux系統提供了兩個編輯器,sed和gawk,下面來初步認識下這兩個編輯器。
1.sed編輯器
sed編輯器被稱作為流編輯器(stream editor),跟普通互動式文字編輯器恰恰相反。在文字編輯器中(比如vim),你可以使用鍵盤命令來互動式地插入、刪除和替換資料中的文本。流編輯器則會在編輯器處理資料之前基於預先提供的一組規則來編輯資料流。
它會將產生的資料輸出到STDIN。
sed命令使用格式如下:
sed options script file
option選項有:
- -e 將script中指定的命令添加到啟動並執行命令中;
- -f 將file中指定的命令添加到啟動並執行命令中;
- -n 不要為每個命令產生輸出,等待print命令來輸出。
1.1 在命令列定義編輯器命令
命令列簡單測試如下:
echo "this is my test " | sed 's/test/big test/
輸出結果如下所示:
===============
this is my big test
===============
對於一個文字檔data1,內容如下
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
this is a lazy dog
使用下列命令:
sed 's/dog/cat/' data1
得到輸出如下所示:
===============
this is a lazy cat
this is a lazy cat
this is a lazy cat
……
===============
認真看看,可以看出該命令是將‘dog’換成了‘cat’,是不是感覺很神妙呀,是的,sed就是這麼牛逼。
1.2在命令列使用多個編輯器命令
命令列下輸入命令:
sed -e 's/lazy/health/; s/dog/cat/' data1
輸出如下所示:
================
this is a health cat
this is a health cat
this is a health cat
……
===============
看看下面另一種輸入的例子
注意:sed自身不會修改文字檔的資料。它只會將修改後的資料發送到STDOUT。
1.3從檔案中讀取編輯器命令
把命令寫到script1檔案中
s/lazy/health/s/dog/cat/
使用-f
命令來制定檔案:
sed -f script data1
會得到上面相同的效果。
2.gawk程式
gawk是Unix中的原始awk程式的GNU版本。在gawk程式設計語言中,你可以做下面的事情:
- 定義變數來儲存資料;
- 使用算術和字串操作符來處理資料;
- 使用結構化編程概念,比如if-then語句和迴圈,來為資料增加邏輯;
- 提取資料檔案中的資料元素並將它們按照另一順序或格式重新放置,從而產生格式化報告。
2.1gawk命令格式
gawk option program file
2.2從命令列讀取程式指令碼
gawk '{print "hello john!"}'
上述命令會在每行文本執行一遍程式指令碼,輸出“hello john!”.
2.3使用資料字元變數
- $0代表整個文本行
- $1代表文本行中的第一個資料欄位
- $2代表文本行中的第二個資料欄位
- $n代表文本行中的第n個資料欄位
如:
gawk '{print $1} ' data1
2.4在程式中使用多個命令
如下所示:
echo "my name is none!" | gawk '{$4="null";print $0}'
2.5從檔案中讀取檔案
和sed一樣使用-f指定,script2檔案內容:
{print $1 "'s home directory is " $6}
命令列執行命令:
gawk -F: -f script2 /etc/passwd
輸出結果如所示:
2.6在處理資料之前運行
使用BEGIN,如下
gawk 'BEGIN{print "the program begining"} {print $0}' data2
會執行BEGIN指定的內容。
2.7在處理資料之後運行
使用END,如下:
gawk 'BEGIN{ print "the program begining"} {print $0} END{print "END of File"}' data2
References
【1】Linux命令列與shell指令碼編程大全(第二版)
本欄目Linux學習專題持續更新中…