初學Linux之文本處理工具和正則表達
之前我們已經了解了 Linux 系統中的用戶、組和文件管理權限,對文件的設置權限,就是為了安全的存儲數據、訪問數據的。但是數據本身并不是按照我們預想的那樣,有規律的存儲好,之后讓我們方便的訪問,得到的數據在存儲前,很多都是雜亂無章的,尤其是文本數據,這就要求我們對數據進行分析、處理、規范后進行保存,方便后續的訪問和讀取。下面我們就要了解文件處理相關的工具,以及正則表達在文本處理中的使用。
一、各種文本工具來查看、分析、統計文本 ?
在前面我們已經學習了 cat 命令,這是個同時具備“標準輸入”和“標準輸出”命令,具體的功能是讀取文本文件的內容,再輸出到屏幕顯示。它本身的功能是簡單的,但是加上選項功能,再通過管道傳遞,重定向到文件,它就可以成為一個文本處理的工具。
?
cat命令的 -n 、-b 以及 -s 選項都是很好的功能,方便我們處理一些簡單的文本,比如我們需要為文本內容的每行添加行號,同時去掉文本中多余的空格行,就可以使用右邊的命令:cat -ns? file.txt >newfile.txt 。
有意思的是,Linux中有一個“tac” 命令,名稱和文本輸出和 cat 剛好都是顛倒的,比如一個文件有兩行內容,cat 讀取輸出是第一行 12 ,第二行 34 。用 tac 輸出則是第一行 43,第二行21 。而另外一個倒敘輸出的命令是 “rev ” 它的功能是處于 cat 和 tac 的中間,是將文本的每一行倒敘輸出的,但是行序還是原來的。那么,rev 讀取上面文件的輸出就是:第一行 21 ,第二行 43 。? 注:cat 、tac、rev 都是具備標準輸入和標準輸出的。
接著是 more? 和? less? 命令,也是讀取文件到標準輸出的,這個命令是將行數比較多的文件內容,分頁顯示,顯示后,都是使用空格鍵(space)翻頁,不同的是 less 命令支持往回翻頁,同時具備匹配搜索功能,這兩點? more 命令是不支持的。索引是在less 頁面,點擊 【?】【/】這個鍵操作的,【?】是在這個鍵的上面,是從頁面向上進行檢索,而【/】則是相反,按鍵 n 是按照檢索的順序進行搜索,shift+n 是逆序進行搜索。
head 和 tail? 是獲取文件頭部行和尾部行的命令,默認是取 10 行,用戶可以自己定義需要取出的行數,具體的用法都已經在上面的圖片中詳細說明了。
cut :將文件中有規律標記符號分割,具備相同書寫格式的行,通過標記符號剪切出指定字段內容的工具。
paste:合并兩個文件相同行的命令,它的 -s 選項比較特殊,是將單個文本的多行合并到一行輸出,多個文本按照順序成為輸出的不同行。
? ?
wc? :統計文本的計數行總數、單詞總數、字節總數和字符總數,在屏幕輸出以上數據的文本統計工具。
sort :主要功能是排序,排序的過程中可以按照字母(首字母),也可以按照數字(整個指定的列),排序過程中可以去除重復項。
?
uniq? :這個命令最主要的功能是將前后相同的重復行。-c 是比較常用的選項,可以將重復的次數顯示,這樣變相的統計了出現的次數。當然前提是前后相接的行,sort 可以做到這一點,所以在Linux中,sort 和 uniq 這兩個命令是常常一起合用的。
diff :找不同的命令,可以對比兩個文本內容之間的差別的命令。使用 -u 選項來輸出“統一的(unified)”diff格式文 件,最適用于補丁文件 。
patch :復制其他文件中的改變,將不同的地方同步到指定文件的命令。
? ? ? ? 以上列出的命令都是功能不是很復雜的文本處理工具,但是基于標準輸出和管道的功能,我們可以將這些命令的功能由簡單到復雜,逐漸拼湊出功能復雜的命令選項。
比如:查詢并發連接的遠程IP最多的前三個IP,就可以使用下面的命令進行處理。
cut -d” ” -f 1 ? /var/log/httpd/access_log | sort |uniq -c|sort -nr |head -3
二、grep ?
前面我們已經學習了簡單的文本處理工具,接下來我們需要了解功能較強的文本處理工具,比較普遍啟用的是 grep系列(grep、egrep、fgrep)、sed 、awk ,這三個經常被稱為Linux系統文本處理三劍客,我們先學習 grep 。
? ? ? ?? grep 由很多的選項功能,這些都是非常有用的,這也從側面說明了它功能的豐富,支持的是基本正則表達(BRE),并不支持ERE,和簡單工具組合命令處理文本相比,grep的優勢在于靈活。一般的思維狀態下,我們需要搜索具有某內容的行,就會搜索明確的字符串,但是在正常使用中,為了更加靈活的查找更大范圍,我們往往是使用模糊查詢的,若是使用模糊查詢,通配符是一種方法,還有一種就是接下來學習的正則表達式,有了它,我們的文本處理三劍客才變得靈活。
三、正則表達式和擴展正則表達式
我們在之前的介紹中,有一個 less 命令也是支持搜索匹配的,less 命令也是支持正則表達的。正則表達(RE:Regular expressions):由一類特殊字符及文本字符所編寫的模式,其中有 些字符(元字符)不表示字符字面意義,而表示控制或通配的功能。 正則表達在很多的程序和系統都會使用到,是一個普遍的功能。基本正則表達(BRE)和擴展正則表達(ERE)是正則表達的兩個分類。具體的介紹,我們也可以查詢 man 幫助文檔(man 7 regex),里面有詳細的介紹。
上面圖片中,綠色背景顯示的是基本正則表達和擴展正則表達同時支持的符號表達,藍色的是基本正則表達式中的符號表示,擴展正則表達是不包括的。
需要注意的是符號“ * ” 和 “ . * ” 的使用,它們在使用時是盡可能的進行匹配,是一種貪婪模式。比如文件 f1 有且僅有一行,由11個1連串組成的字符串。一般的理解下,當我們用戶 “ 1* ” 符號匹配,那么就是 對1任意重復次數進行匹配,1任意重復的情況就是 “? ” 、“ 1 ” 、“ 11 ”、 “ 111 ”…….? 這樣的情況,我們可以用 grep 工具表示為 :grep? -o? -e? ‘1’ ? -e ’11’ -e? ‘111’? ……? f1 各個匹配項是或者的關系,也就是 1* (1重復任意次),那么正常輸出的結果就是不同個數的1 各占一行。但是系統不是這樣的,計算機不會去對一個未知次數的選項進行匹配,它在匹配過程中不是生成隨機個重復1 進行匹配,它按照最大可能匹配的,如果是11個1,那么 1*就是匹配的11個,只會輸出一行。
?? !注意:當由兩個相同的貪婪選項同時進行匹配的情況下,后面的貪婪是收到一定的限制的。
四、egrep
egrep 支持的是擴展正則表達(ERE),不支持基本正則表達(BRE),它和 grep? -E 是相同的,相當于是一種縮寫形式。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/89742