grep egrep 用法以及其相應的正則表達式
一、grep、egrep命令
本文中主要介紹了linux系統下grep egrep fgrep命令和正則表達式的基本參數和使用格式、方法。
1.grep的定義:
grep(global search regular RE ) and print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它只能使用基本的正則表達式來搜索文本,並把匹配的行打印出來。
grep是很常見也很常用的命令,它的主要功能是進行字符串數據的比較,然後符合用戶需求的字符串打印出來,但是主意,grep在數據中查找一個字符串時,是以“整行”爲單位進行數據篩選的。
2.grep命令的作用:
文本搜索工具,根據用戶指定的”pattern(過濾條件)“對目標文本逐行進行匹配檢查;打印出符合條件的行;模式:由文本字符及正則表達式元字符所編寫的過濾條件。
grep是在一個或多個文件中搜索字符串模板。如果模板包括空格,則必須被引用,模板後的所有字符串被看作文件名。搜索的結果被送到屏幕,不影響原文件內容。
grep可用於shell腳本,因爲grep通過返回一個狀態值來說明搜索的狀態,如果模板搜索成功,則返回0,如果搜索不成功,則返回1,如果搜索的文件不存在,則返回2。我們利用這些返回值就可進行一些自動化的文本處理工作。
3.grep命令基本用法
格式:grep [OPTIONS] PATTERN [FILE...]
grep常用選項一:
--color=auto:對匹配到的文本着色後高亮顯示;
-i:忽略字符大小寫; grep -i /etc/passwd
-o:僅顯示匹配到的文本自身; grep -o ‘root‘ /etc/passwd
-v,--invert-match:反向匹配,即顯示沒有'搜索字符串'內容的那行;
例: 顯示/etc/passwd文件中不以bash結尾的行;
~]# grep -v "bash$" /etc/passwd
-q, --quiet,--silient:靜默模式,不輸出任何信息;
-a:在二進制文件中,以文本文件的方式搜索數據
-c:計算找到'搜索字符串'的次數;
-n:輸出行號;
-A #:after ,顯示匹配到字符那行的後面#行;
-B #:before,顯示匹配到字符那行的前面#行;
-C #:context,顯示匹配到字符那行的前後#行;
grep 常用選項之二:
-E,--extended-regexp:支持使用擴展正則表達式,相當於egrep.
-F,--fixed-strings:支持使用固定字符串,不支持正則表達式,相當於fgrep;
-G,--basic-regexp:支持使用基本正則表達式;
-P,--perl-regexp:支持使用pcre正則表達式;
-e PATTERN,--regexp=PATTERN:多模式機制;
-f FILE, --file=FILE:FILE爲每行包含了一個pattern的文本文件,即grep script;
-A NUM, --after-context=NUM 顯示匹配到字符那行的後面#行;
-B NUM, --before-context=NUM 顯示匹配到字符那行的前面#行;
-C NUM, -NUM, --context=NUM 顯示匹配到字符那行的前後#行;
4.egrep的定義:
egrep命令是一個搜索文件獲得模式,使用該命令可以任意搜索文件中的字符串和符號,也可以爲你搜索一個多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字、一個句子。egrep支持使用擴展正則表達式的grep命令,相當於grep -E。
5.egrep命令的作用:
Linux egrep命令用於在文件內查找指定的字符串。
egrep執行效果與"grep-E"相似,使用的語法及參數可參照grep指令,與grep的不同點在於解讀字符串的方法。
egrep是用extended regular expression語法來解讀的,而grep則用basic regular expression 語法解讀,extended regular expression比basic regular expression的表達更規範。
6.egrep命令基本用法
格式:egrep [OPTIONS] PATTERN [FILE...]
常用選項:
-c :僅顯示匹配行的計數。
-e :模式 指定一個模式。這象一個簡單的模式但是它在模式以一個-(負號)開始時很有用。
-f :StringFile 指定包含字符串的文件。
-h :當處理多個文件時排除文件名。
-i :當進行比較時忽略字符的大小寫。
-n :在每行之前加上該行在文件中的相對行號。
-q :禁止所有的輸出到標準輸出,不管匹配行。如果選中輸入行,以 0 狀態退出。
-s :僅顯示出錯消息。這點對檢查狀態有用。
-v :顯示除了與指定的模式匹配的行之外的所有行。
-w :執行單詞搜索。
-x :顯示與指定模式精確匹配而不含其它字符的行。
-y :當進行比較時忽略字符的大小寫
二、正則表達式
1.基本定義:
正則表達使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。簡而言之,正則表達式就是處理字符串的方法,以行爲單位進行字符串的處理,通過一些特殊符號的輔助,可以讓用戶輕鬆搜索/替換某特定的字符串。
正則表達式分爲兩類:基本的正則表達式和擴展的正則表達式。
2.grep 相應的正則表達式詳細介紹
2.1、基本的正則表達式:
(1)元字符:
.:匹配任意單個字符
例:查找包含student且student後面帶一個字符的行
grep ‘student.’ /etc/passwd
(模式可以用單引號和雙引號,如果模式中要做變量替換時則必須用雙引)
[] :匹配指定範圍內的任意單個字符,[abc],[a-z],[0-9],[a-zA-Z]
例:查找帶有數字的行
grep ‘[0-9]’ /etc/passwd
[^] :匹配指定範圍外的任意單個字符
例:查找沒有小寫字母的行。
grep ‘[^a-z]’ /etc/inittab
[:space:]:表示空白字符;
[:punct:]:表示所有標點符號的集合;
[:lower:]:表示所有的小寫字母;
[:upper:]:表示所有的大寫字母;
[:alpha:]:表示大小寫字母;
[:digit:]:表示數字;
[:alnum:]:表示數字和大小寫字母-----使用格式[[:alnum:]]等
(2)匹配次數:用在要指定其出現的次數的字符的後面,用於限制其前面字符出現的次數;默認工作於貪婪模式;
* :匹配其前面的字符任意次,0,1,多次;
例如:grep "x\+y" abxy
.*:匹配任意長度的任意字符
例如:查找包含student的行
grep 'student.*' /etc/passwd
\?:匹配其前面的字符1次或0次,即其前面的字符是可有可無的;
\+:匹配其前面的字符1次或多次;即其面的字符要出現至少1次;
\{m\}:匹配其前面的字符m次;
\{m,n\}:匹配其前面的字符至少m次,至多n次;
\{0,n\}:至多n次;
\{m,\}:至少m次;
(3)位置錨定:
^:錨定行首,用於模式的最左側;即此字符後面的任意內容必須出現在行首。
$:行尾錨定,用於模式的最右側即此字符前面的任意內容必須出現在行尾。 ^PATTERN$:用於PATTERN來匹配整行;
^$:空白行;
^[[:space:]]*$:空行或包含空白字符的行;
(4)單詞:非特殊字符組成的連續字符(字符串)都稱爲單詞;
\< 或 \b:詞首錨定,用於單詞模式的左側;
\> 或 \b:詞尾錨定,用於單詞模式的右側;
\<PATTERN\>:匹配完整單詞;
(5)分組及引用
\(\):將一個或多個字符捆綁在一起,當作一個整體進行處理;
例:\(xy\)*ab
Note:分組括號中的模式匹配 到的內容會被正則表達式引擎自動記錄於內部的變量中,這些變量爲:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符;
...
~]# nano lovers.txt
He loves his lover.
He likes his lover.
She likes her liker.
She loves her liker.
~]# grep "\(l..e\).*\1" lovers.txt
(1表示引用前面括號中的匹配結果)
(6)後向引用:引用前面的分組括號中的模式所匹配到的字符;
小試牛刀:
1、找出/etc/passwd文件中的兩位數或三位數;
~]# grep "\<[0-9]\{2,3\}\>" /etc/passwd
2、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,且後面非空白字符的行;
~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
3、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行;
~]# netstat -tan | grep "LISTEN[[:space:]]*$"
2.2、擴展的正則表達式:
擴展的正則表達只是在基本的正則表達上作出了一點修改,如下:
在擴展的正則表達中\( \)==();\{ \}=={ };
+:次數匹配,匹配其前面的字符至少出現一次,無上限;
a|b:a或者b(二取一),其餘的都一樣。
基本正則表達式,使用(){} . ? |都需要轉義,在擴展正則表達中不需要加\,詳細信息如下:
(1)字符匹配的命令和用法與基本正則表達式的用法相同。
(2)次數匹配:
*:匹配其前面字符的任意次
?:匹配其前面字符的0此或着1此
+:匹配其前面字符至少1此
{m,n}:匹配其前面字符m到n次
(3)字符錨定的用法和基本正則表達式的用法相同。
(4)特殊字符:
| : 或者的意思。
例:grep -E 'c|cat' file 表示在文件file內查找包含c或者cat;
3.egrep 相應的正則表達式詳細介紹:
egrep:支持使用擴展正則表達式的grep命令,相當於grep -E;
擴展正則表達式的元字符egrep [OPTIONS] PATTERN [FILE...]:
3.1、基本的正則表達式:
(1)字符匹配:
.:任意單個字符
[ ]:範圍內的任意單個字符
[^ ]:範圍外的任意單個字符
(2)匹配次數:
*:任意次;
?:0次或1次;
+:1次或多次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}:至多n次;
{m,}:至少m次;
(3)位置錨定:
^:行首錨定
$:行尾錨定
\<, \b:詞首錨定
\>, \b:詞尾錨定
(4)分組及引用:
(pattern):分組,括號中的模式匹配到的字符會被記錄於正則表達式引擎內部的變量中;
後向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
小試牛刀:
1、顯示/etc/passwd文件中不以bash結尾的行;
~]# egrep -v "bash$" /etc/passwd
2、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少用三種方式實現;
~]# egrep "^(s|S)" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -i "^s" /proc/meminfo
3、顯示當前系統上root、centos或slackware用戶的相關信息;
~]# egrep "^(root|centos|slackware)\>" /etc/passwd
4、echo輸出一個絕對路徑,使用egrep取出其基名;
~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"
5、找出ifconfig命令結果中的1-255之間的整數;
~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
6、添加用戶bash、testbash、basher及nologin,要求前三個用戶的默認shell爲/bin/bash,nologin的默認shell爲/sbin/nologin,而後找出其用戶名與shell名相同的用戶;
~]#useradd -s /bin/bash bash
~]#useradd -s /bin/bash testbash
~]#useradd -s /bin/bash basher
~]#useradd -s /sbin/nologin nologin
~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd