一、grep?主要用于搜索某些字符串;sed、awk?用于處理文本:
grep基本是以行為單位處理文本的;?而awk可以做更細分的處理,通過指定分隔符將一行(一條記錄)劃分為多個字段,以字段為單位處理文本。awk中支持C語法,可以有分支條件判斷、循環語句等,相當于一個小型編程語言。
awk功能比較多是一個編程語言了。?grep功能簡單,就是一個簡單的正則表達式的匹配。?awk的功能依賴于grep。
grep可以理解為主要作用是在一個文件中查找過濾需要的內容。awk不是過濾查找,而是文本處理工具,是把一個文件處理成你想要的格式。
二、使用awk的三理由:
AWK的功能是什么?與sed和grep很相似,awk是一種樣式掃描與處理工具。但其功能卻大大強于sed和grep。awk提供了極其強大的功能:它幾乎可以完成grep和sed所能完成的全部工作,同時,它還可以可以進行樣式裝入、流控制、數學運算符、進程控制語句甚至于內置的變量和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上,awk的確擁有自己的語言:awk程序設計語言,awk的三位創建者已將它正式定義為:樣式掃描和處理語言。??使用awk的第一個理由是基于文本的樣式掃描和處理是我們經常做的工作,awk所做的工作有些象數據庫,但與數據庫不同的是,它處理的是文本文件,這些文件沒有專門的存儲格式,普通的人們就能編輯、閱讀、理解和處理它們。而數據庫文件往往具有特殊的存儲格式,這使得它們必須用數據庫處理程序來處理它們。既然這種類似于數據庫的處理工作我們經常會遇到,我們就應當找到處理它們的簡便易行的方法,UNIX有很多這方面的工具,例如sed?、grep、sort以及find等等,awk是其中十分優秀的一種。?
使用awk的第二個理由是awk是一個簡單的工具,當然這是相對于其強大的功能來說的。的確,UNIX有許多優秀的工具,例如UNIX天然的開發工具C語言及其延續C++就非常的優秀。但相對于它們來說,awk完成同樣的功能要方便和簡捷得多。這首先是因為awk提供了適應多種需要的解決方案:從解決簡單問題的awk命令行到復雜而精巧的awk程序設計語言,這樣做的好處是,你可以不必用復雜的方法去解決本來很簡單的問題。例如,你可以用一個命令行解決簡單的問題,而C不行,即使一個再簡單的程序,C語言也必須經過編寫、編譯的全過程。其次,awk本身是解釋執行的,這就使得awk程序不必經過編譯的過程,同時,這也使得它與shell?script程序能夠很好的契合。最后,awk本身較C語言簡單,雖然awk吸收了C語言很多優秀的成分,熟悉C語言會對學習awk有很大的幫助,但awk本身不須要會使用C語言——一種功能強大但需要大量時間學習才能掌握其技巧的開發工具。?
使用awk的第三個理由是awk是一個容易獲得的工具。與C和C++語言不同,awk只有一個文件(/bin/awk),而且幾乎每個版本的UNIX都提供各自版本的awk,你完全不必費心去想如何獲得awk。但C語言卻不是這樣,雖然C語言是UNIX天然的開發工具,但這個開發工具卻是單獨發行的,換言之,你必須為你的UNIX版本的C語言開發工具單獨付費(當然使用D版者除外),獲得并安裝它,然后你才可以使用它。?
基于以上理由,再加上awk強大的功能,我們有理由說,如果你要處理與文本樣式掃描相關的工作,awk應該是第一選擇。在這里有一個可遵循的一般原則:如果你用普通的shell工具或shell?script有困難的話,試試awk,如果awk仍不能解決問題,則便用C語言,如果C語言仍然失敗,則移至C++。
三、sed是一個非交互性文本流編輯器:
sed編輯器按照一次處理 一行的方式來處理文件(或者輸入)并把輸出送到屏幕上。你可以在vi和ex/ed編輯器里識別他的命令。sed把當前正在處理的行保存在一個臨時緩存里,這個緩存叫做模式空間。一但sed完成了對模式空間里的行的處理(即對該行執行sed命令),就把模式空間的行送到屏幕上(除非該命令要刪除該行活禁止打印)。處理完該行之后,從模式空間里刪除它,然后把下一行讀入模式空間,進行處理,并顯示。當輸入文件的最后一行處理完后,sed終止。通過把每一行存在一個臨時緩存里并編輯該行,初始文件不會被修改或被破壞。