Linux學習-進階shell指令碼編程(二)初識sed和gawk,sedgawk

來源:互聯網
上載者:User

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學習專題持續更新中…

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.