一、linux文本處理三劍客介紹
linux中文本三劍客包括grep(egrep,fgrep),sed,awk,三者基本的功能如下:
工具名稱 | 功能 |
grep,egrep,fgrep | 文本過濾工具(搜索工具) |
sed | stream editor, 流編輯器;文本編輯工具 |
awk | 文本報告生成器 |
二、grep工具詳解
1、grep的介紹:
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。
grep主要包含以下三個命令:
grep:支持使用正則表達式
egrep:支持使用擴展正則表達式
fgrep:不支持正則表達式
備註:egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。
2、grep的使用:
grep命令的使用模式主要有2種:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
接下來我們針對命令選項(options)做出詳細的說明,模式(pattern)指的是正則表達式,我將在後面對其進行單獨解釋。
grep的選項主要有:
--color[=WHEN]:對匹配到的文本着色後高亮顯示;
[WHEN]的值主要有:never,always,auto,系統默認的是auto,可以使用alias命令查詢:
-i:ignorecase,忽略字符的大小寫
-o:僅顯示匹配到的字符串本身;
-v, --invert-match:顯示不能被模式匹配到的行;
-q, --quiet, --silent:靜默模式,即不輸出任何信息,可使用"$?"查詢執行狀態。
-A #:after, 後#行
-B #:before,前#行
-C #:context,前後各#行
-e:可以匹配多個模式:
-n:查找出來的結果顯示行號:
-f file:以某個文件中的內容作爲pattern,進行查詢
-E:支持使用擴展的正則表達式元字符;
此命令等同於直接使用egrep。
-F:不支持使用正則表達式元字符;
此命令等同於直接使用fgrep
三、grep與正則表達式使用
1、什麼是正則表達式
正則表達式(也稱爲 “regex” 或 “regexp”)是一種描述文本字符串或模式的方式,它主要由元字符和一般字符組成。
在這裏我們需要與shell的元字符區別開來,其實也是比較容易區別開的,shell的元字符主要作用於命令的,如下:
shell元字符 | |
$ | 作變量或運算替換 |
> | 重導向標準輸出 |
< | 重導向標準輸入 |
| | 命令管道 |
( ) | 用於運算或命令替換 |
; | 在前一個命令結束時,而忽略其返回值,繼續執行下一個命令 |
&& | 在前一個命令結束時,若返回值爲 true,繼續執行下一個命令 |
|| | 在前一個命令結束時,若返回值爲 false,繼續執行下一個命令 |
! | 執行 history 列表中的命令 |
shell 元字符,基本是作用在命令上面,本文就不再一一贅述。 |
正則表達式的元字符可以分爲三類:
字符匹配
元字符 | 表示內容 |
. | 匹配任意單個字符 |
[] | 匹配指定範圍內的任意單個字符 |
[^] | 匹配指定範圍外的任意單個字符 |
[:digit:] | 數字,與[0-9]等價 |
[:lower:] | 小寫字母,等同於[a-z] |
[:upper:] | 大寫字母,等同於[A-Z] |
[:alpha:] | 字母,等同於[A-Za-z] |
[:alnum:] | 字母和數字,等同於[A-Za-z0-9] |
[:punct:] | 標點符號 |
[:space:] | 空白字 |
次數匹配
元字符 | 表示內容 |
* | 匹配其前面的字符任意次;0,1,多次 |
.* | 匹配任意長度的任意字符 |
\? | 匹配其前面的字符0次或1次;即其前面的字符是可有可無的 |
\+ | 匹配其前面的字符1次或多次;即其面的字符要出現至少1次 |
\{m\} | 匹配其前面的字符m次 |
\{m,n\} | 匹配其前面的字符至少m次,至多n次 |
位置錨定
元字符 | 表示內容 |
^ | 行首錨定;用於模式的最左側 |
$ | 行尾錨定;用於模式的最右側, |
\< 或 \b | 詞首錨定,用於單詞模式的左側 |
\> 或 \b | 詞尾錨定,用於單詞模式的右側 |
2、正則表達式的使用
要熟練的使用正則表達式,需要對其元字符有充分的理解,下面就對元字符的實際使用進行一一介紹:
1、字符匹配:
. : 匹配任意單個字符,如下圖:
[]:匹配指定範圍內的任意單個字符,如下圖:
[^]:匹配指定範圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]:數字,小寫字母,大寫字母,字母,字母和數字,符號,空白字符。
2、次數匹配:
*:匹配其前面的字符任意次;0,1,多次
.*:匹配任意長度的任意字符.
\? : 匹配其前面的字符0次或1次;即其前面的字符是可有可無的
\+ : 匹配其前面的字符1次或多次;即其面的字符要出現至少1次
\{m,n\} 匹配其前面的字符至少m次,至多n次
3、 位置錨定
^: 行首錨定;用於模式的最左側
$:行尾錨定;用於模式的最右側
\< 或 \b:詞首錨定,用於單詞模式的左側
\> 或 \b:詞尾錨定,用於單詞模式的右側
4、分組與引用
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理,分組括號中的模式匹配 到的內容會被正則表達式引擎自動記錄於內部的變量中,這些變量爲\1,\2...。
3、擴展正則表達式
擴展正則表達式與正則表達式最大不同的地方是,有些特殊的符號,不需要轉義符(\)轉移,可直接使用,以下是擴展正則表達式的元字符列表:
字符匹配
元字符 |
表示內容.匹配任意單個字符[]匹配指定範圍內的任意單個字符[^]匹配指定範圍外的任意單個字符[:digit:]數字,與[0-9]等價[:lower:]小寫字母,等同於[a-z][:upper:]大寫字母,等同於[A-Z][:alpha:]字母,等同於[A-Za-z][:alnum:]字母和數字,等同於[A-Za-z0-9][:punct:]標點符號[:space:]空白字與正則表達式的元字符相同
次數匹配
元字符 | 表示內容 |
* | 匹配其前面的字符任意次;0,1,多次 |
.* | 匹配任意長度的任意字符 |
? | 匹配其前面的字符0次或1次;即其前面的字符是可有可無的 |
+ | 匹配其前面的字符1次或多次;即其面的字符要出現至少1次 |
{m} | 匹配其前面的字符m次 |
{m,n} | 匹配其前面的字符至少m次,至多n次 |
其中的轉義符都可以去掉,使用方法一樣。 |
位置錨定
^ | 行首錨定;用於模式的最左側 |
$ | 行尾錨定;用於模式的最右側, |
\< 或 \b | 詞首錨定,用於單詞模式的左側 |
\> 或 \b | 詞尾錨定,用於單詞模式的右側 |
錨定詞首詞尾的轉義符不可省略。 |
分組或引用
():將次PATTERN匹配到的字符當做一個整體處理;分組括號中的模式匹配到的字符會被正則表達式引擎自動紀錄於變量中,這些變量分別是\1,\2,\3, 元字符的轉義符可省略,但引用時的\1,\2不可省略
或:
| :a|b:a或b
c|cat :c或cat
(c|c)at:c或c
以下是幾個實例:
找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行
找出ifconfig命令結果中的1-255之間的數值