一、grep、egrep、fgrep命令
說明:本文在CentOS 6.6 X86_64系統下grep、egrep、fgrep命令和正則表達式的基本參數和使用格式、方法。
1.1、基本定義:
grep(Global search Regular Expression ) and Print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它只能使用基本的正則表達式來搜索文本,並把匹配的行打印出來。
grep是很常見也很常用的命令,它的主要功能是進行字符串數據的比較,然後符合用戶需求的字符串打印出來,但是主意,grep在數據中查找一個字符串時,是以“整行”爲單位進行數據篩選的。
egrep命令等同於grep -E,利用此命令可以使用擴展的正則表達式對文本進行搜索,並把符合用戶需求的字符串打印出來。
fgrep命令等同於grep -F,它利用固定的字符串來對文本進行搜索,但不支持正則表達式的引用,所以此命令的執行速度也最快。
正則表達式組成:
正則中的字符分爲元字符和一般字符,一般字符就匹配它本身(寫什麼就是什麼,比如正則中寫字母‘a’,匹配的時候就匹配字母‘a’),而元字符是正則表達式中最基本的內容,也是最核心的內容,基本上所有的正則表達式都由“元字符”組成,元字符就是正則表達式的基礎。在此文中,會涉及到字符組,多選結構,點號以及預定義字符集的基本介紹。
正則表達式作用:
正則表達式在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。簡而言之,正則表達式就是處理字符串的方法,以行爲單位進行字符串的處理,通過一些特殊符號的輔助,可以讓用戶輕鬆搜索/替換某特定的字符串。
名稱解釋:
元字符:所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符。這些元字符(專用的字符或則字符組),可以代替多個一個或多個字符。
正則表達式:由一類字符書寫的模式,其中有些字符不表示字符的字面意義,而是表示控制或通配的功能。
1.2、命令基本用法:
1.2.1、grep用法
grep [OPTIONS] 'PATTERN' [FILE...]
grep常用選項:
-c :計算找到'搜索字符串'的次數
-i :忽略大小寫
-v :反向查找,即顯示沒有'搜索字符串'內容的那行
-o :只顯示被模式匹配的字符串
-n :輸出行號
--colour(color):顏色顯示
-A:顯示匹配到字符那行的後面n行
-B:顯示匹配到字符那行的前面n行
-C:顯示匹配到字符那行的前後n行
1.2.2、egrep用法:
同grep用法,本處略。
1.2.3、fgrep用法:
fgrep [OPTIONS] 'String' [FILE...]
同grep用法,本處略。
1.2.4、grep的匹配選擇:
grep -G, --basic-regexp:以標準正則表達式,進行匹配。
grep -E, --extended-regexp:以擴展正則表達式,進行匹配。
grep -F, --fixed-strings:以'字符串',進行匹配。
grep -P, --perl-regexp:以Perl的正則表達式,進行匹配。
二、標準正則表達式
2.1、基本元字符:
一般字符:匹配自身
.:匹配任意除換行符"\n"外的字符。
\:轉義字符,使後一個字符改變原來的意思。如果字符串中有字符*需要匹配,可以使用\*或字符集[*]
[...]:字符集(字符類)。對應的位置可以是字符集中任意單個字符。字符集中的字符可以逐個列出,也可給出範圍。
[^]:匹配指定集合外的任意單個字符
2.2、預定義字符集(可以寫在字符集[...]中)
字符集合:
[:space:] 所有的空白字符, [[:space:]]
[:punct:] 所有標點符號
[:lower:] 所有小寫字母
[:upper:] 所有大寫字母
[:digit:] 所有數字
[:alpha:] 所有字母
[:alnum:] 所有字母和數字
2.3、數量詞:
*: 匹配其前面的字符任意次,0,1或多次;
\?:匹配其前面的字符0次或1次;
\+: 匹配其前面的字符出現至少1次;
\{m\}: 匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
.*: 匹配任意長度的任意字符
2.4、字符錨定:
^: 行首錨定
寫在模式的最左側
$: 行尾錨定
寫在模式的最右側
^$: 空白行
\<: 詞首錨定, \b
出現在要查找的單詞模式的左側;\<char
\>:詞尾錨定, \b
出現在要查找的單詞模式的右側;char\>
\<pattern\>: 匹配單詞
2.5、分組:
\(\):被括起來的表達式將作爲分組,行表達式左邊開始每遇到一個分支的左括號'(',編號+1。
後向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容後面的模式中可以被引用;
\1, \2, \3
模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;
三、擴展正則表達式
字符匹配:
.:匹配任意除換行符"\n"外的字符。
[...]:字符集(字符類)。對應的位置可以是字符集中任意單個字符。字符集中的字符可以逐個列出,也可給出範圍。
[^]:匹配指定集合外的任意單個字符
匹配次數限定:
*:匹配其前面的字符任意次,0,1或多次;
?: 匹配其前面字符0次或1次;
+:匹配其前面的字符至少1次;
{m}:匹配其前面的字符m次;
{m,n}:匹配其前面的字符最少m次,最多n次;
{m,}:匹配其前面的字符最少m次;
{0,n}:匹配其前面的字符0次,最多n次;
錨定:
^:行首錨定;
$:行尾錨定;
\<, \>: \b:匹配單詞
分組:
(...):被括起來的表達式將作爲分組,行表達式左邊開始每遇到一個分支的左括號'(',編號+1。
支持後向引用:\1, \2, ...
或者:
|:|代表左右表達式任意匹配一個。它總是先嚐試匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。
四、例子演示:
4.1、grep基本用法:
# grep -c 'HOSTNAME' /etc/rc.sysinit
# grep -i 'HOSTNAME' /etc/rc.sysinit
# cat human_info.txt
# grep -v 'allen' human_info.txt
# grep -o 'alex' human_info.txt
# grep -n 'alex' human_info.txt
# grep -A 1 'alex' human_info.txt
# grep -B 1 'alex' human_info.txt
# grep -C 1 'alex' human_info.txt
4.2、基本正則表達式
cat demo_info.txt
abc
abcabc
abc edf
a,b,c
123
ABC
abc123
## 集合
# grep '[[:space:]]' demo_info.txt
# grep '[[:punct:]]' demo_info.txt
# grep '[[:upper:]]' demo_info.txt
# grep '[[:lower:]]' demo_info.txt
# grep '[[:digit:]]' demo_info.txt
## 數量詞
## 位置錨定 (單詞錨定)