在linux下,grep、awk和sed是很是強大的文本處理工具,其中grep命令主要用做文本搜索,而awk和sed命令側重於文本的編輯等操做,另外awk自己還能夠是編程語言,提供了編程語言中相關的概念。從功能上,總的來講,awk >> sed >> grep。html
grep命令主要用於按行文本搜索,搜索的條件以正則表達式給出。grep在linux下的幫助說明以下:
上面給出的說明較多,這裏提取一些較爲重要且經常使用的選項加以說明。linux
- -E 使用擴展正則表達式規則
- -F 搜索固定字符串,這裏表示的是模式中的內容不使用正則表達式規則去處理
- -G 使用基礎正則表達式,這裏指的是由posix規範定義的正則表達式規則集,相比於咱們平常使用較多的pcre正則表達式少了部分規則
- -P 使用pcre正則表達式規則集
- -r 遞歸搜索整個目錄
具體用法可參考下面的代碼:正則表達式
# 搜索ubuntu下qt5的相關庫 apt search libqt5 # 搜索ubuntu下qt5相關庫,並過濾出全部dev開發包 apt search libqt5 | grep -E "^libqt5.+dev" # posix基礎正則集,不支持定位符,無結果 apt search libqt5 | grep -G "^libqt5.+dev" # 能夠得到qt5庫的dev開發包 apt search libqt5 | grep -P "^libqt5.+dev" # 無任何結果 apt search libqt5 | grep -F "^libqt5.+dev"
sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能不一樣凡響。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無改變,除非使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。sed命令的linux下幫助說明以下圖:express
較爲重要的選項有:編程
- -e <script>或--expression=<script>,以選項中的指定的script來處理輸入的文本文件
- -f <script文件>或--file=<script文件>,以選項中指定的script文件來處理輸入的文本文件
- -n或--quiet或--silent,僅顯示script處理後的結果
從sed的幫助說明中,能夠發現sed的輸入選項較少,換而之,sed的輸入腳本則很重要。sed腳本中經常使用操做以下表:ubuntu
操做符 | 說明 |
---|---|
a\ | 在當前行下面插入文本。 |
i\ | 在當前行上面插入文本。 |
c\ | 把選定的行改成新的文本。 |
d | 刪除,刪除選擇的行。 |
D | 刪除模板塊的第一行。 |
s | 替換指定字符 |
h | 拷貝模板塊的內容到內存中的緩衝區。 |
H | 追加模板塊的內容到內存中的緩衝區。 |
g | 得到內存緩衝區的內容,並替代當前模板塊中的文本。 |
G | 得到內存緩衝區的內容,並追加到當前模板塊文本的後面。 |
l | 列表不能打印字符的清單。 |
n | 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。 |
N | 追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。 |
p | 打印模板塊的行。 |
P(大寫) | 打印模板塊的第一行。 |
q | 退出Sed。 |
b lable | 分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。 |
r file | 從file中讀行。 |
t label | if分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。 |
T label | 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。 |
w file | 寫並追加模板塊到file末尾。 |
W file | 寫並追加模板塊的第一行到file末尾。 |
! | 表示後面的命令對全部沒有被選定的行發生做用。 |
= | 打印當前行號碼。 |
# | 把註釋擴展到下一個換行符之前 |
sed命令的使用實例:數組
# 在當前行下面插入Jackie echo "Hello World" | sed 'a\Jackie' # 結果爲: # Hello World # Jackie # 在當前行上面插入Jackie echo "Hello World" | sed 'i\Jackie' # 結果爲: # Jackie # Hello World # 將選定行修改成Jackie echo "Hello World" | sed 'c\Jackie' # 結果爲: # Jackie # 刪除以Hello字符串開頭的行 echo -e "Hello\nWorld" | sed '/^Hello/d' # 結果爲: # World # 將Hello替換爲Hi echo -e "Hello World" | sed 's/Hello/Hi/' # 結果爲: # Hi World
須要注意的是,上面代碼僅僅列舉出了sed命令較爲簡單的用法,更爲複雜的用法能夠參考sed官方幫助手冊bash
awk是一種編程語言,用於在linux/unix下對文本和數據進行處理。數據能夠來自標準輸入(stdin)、一個或多個文件,或其它命令的輸出。它支持用戶自定義函數和動態正則表達式等先進功能,是linux/unix下的一個強大編程工具。它在命令行中使用,但更可能是做爲腳原本使用。awk有不少內建的功能,好比數組、函數等,這是它和C語言的相同之處,靈活性是awk最大的優點。awk相對於grep和sed更爲複雜,我的以爲除非是特殊的場景,例若有着大量複雜的文本處理需求,不然不建議專門學習其背後的語言。使用時,語法和概念能夠參考官方文檔。awk腳本基本結構以下:編程語言
awk 'BEGIN{ print "start" } pattern{ commands } END{ print "end" }' file編輯器
一個awk腳本一般由:BEGIN語句塊、可以使用模式匹配的通用語句塊、END語句塊3部分組成,這三個部分是可選的。任意一個部分均可以不出如今腳本中,腳本一般是被單引號或雙引號中,例如:
awk 'BEGIN{ i=0 } { i++ } END{ print i }' filename awk "BEGIN{ i=0 } { i++ } END{ print i }" filename
awk的基本工做原理爲:
BEGIN語句塊在awk開始從輸入流中讀取行以前被執行,這是一個可選的語句塊,好比變量初始化、打印輸出表格的表頭等語句一般能夠寫在BEGIN語句塊中。END語句塊在awk從輸入流中讀取完全部的行以後即被執行,好比打印全部行的分析結果這類信息彙總都是在END語句塊中完成,它也是一個可選語句塊。pattern語句塊中的通用命令是最重要的部分,它也是可選的。若是沒有提供pattern語句塊,則默認執行{ print },即打印每個讀取到的行,awk讀取的每一行都會執行該語句塊。
對於grep、sed和awk工具,因爲都圍繞在正則表達式而展開,於是想熟練使用這三個工具進行文本處理,首先必需要深刻了解正則表達式,作到經常使用功能爛熟於心。在瞭解了正則表達式以後,grep和sed命令只要瞭解相關的選項和操做的含義並會用便可,而對於更爲複雜並強大的awk命令則應視狀況而定,若是真有相關場景,在深刻學習和使用便可。