Linux文本三劍客之grep族以及相應的正則表達式html
Grep族是什麼?linux
Grep族是linux學習中搜索文本的重要工具,它基於使用正則表達式來快速簡潔的搜索你想要查看的文本。是搜索文本的不二之選git
何時及在哪裏使用grep呢?正則表達式
上面我們說到了,grep是文本搜索工具,因此當咱們要搜索文本,有搜索文本的須要時咱們就能夠是使用grep工具。shell
下面咱們來談談如何使用grep族命令以及涉及到的正則表達式的內容express
文本搜索工具:grep族:grep, egrep, fgrep centos
Linux上文本處理三劍客bash
grep, egrep, fgrep:文本搜索工具;基於」pattern「對給定文本進行搜索操做;app
sed:Stream EDitor,流編輯器,行編輯工具;文本編輯工具;編輯器
awk:GNU awk,文本格式化工具;文本報告生成器;
egrep和fgrep的命令只跟grep有很小不一樣。egrep和fgrep都是grep的擴展,支持更多的re元字符,fgrep就是fixed grep或fast grep,它們把全部的字母都看做單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,再也不特殊。linux使用GNU版本的grep。它功能更強,能夠經過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
正則表達式:Regular Expression, REGEX
由一類特殊字符及文本字符所編寫的模式,其有些字符不表示其字面意義,而是用於表示控制或通配的功能;
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
正則表達式引擎:利用正則表達式模式分析給定文本的程序;
grep家族:
grep: Global search REgular expression and Print out the line. 支持使用基本正則表達式;
egrep:支持使用擴展正則表達式;
fgrep:不支持使用正則表達式;
grep命令:
做用:文本搜索工具,根據用戶指定的」pattern(過濾條件)「對目標文本逐行進行匹配檢查;打印出符合條件的行;
模式:由文本字符及正則表達式元字符所編寫的過濾條件;
Grep命令的使用:
grep [OPTIONS] PATTERN [FILE...]
經常使用選項:
--color=auto:對匹配到的文本着色後高亮顯示;
-i:忽略字符大小寫;
-o:僅顯示匹配 到的文本自身;
-v, --invert-match:反向匹配;
-E:支持擴展的正則表達式;
-q, --quiet, --silient:靜默模式,不輸出任何信息;
在grep命令中正則表達式元字符表明大含義:
基本正則表達式元字符:
字符匹配:
.:匹配任意單個字符;
任意匹配
[ ]:匹配範圍內的任意單個字符;
匹配範圍內的單個字符,只要包含便可,如紅色字體
[^ ]:匹配範圍外的任意單個字符;
不包括abc都屬於範圍以內,如紅色字體
例如:[:digit:]數字,[:lower:]全部小寫字母, [:upper:]全部大寫字母, [:alpha:]全部的字母包括大小寫, [:alnum:]字母和數字, [:space:]空白字符, [:blank:]空白字符, [:punct:]符號字符等,這裏我就不一一說明了
注:可經過使用命令 ~]#man 7 glob 命令來查看更多的字符的含義
匹配次數:
使用方式:
用在要指定其出現的次數的字符後面,用限制其前面的字符要出現的 次數;默認工做於貪婪模式;
*:匹配前面的字符任意次(0,1或屢次);
grep "x*y":
Xxxyabc ,yabc ,abcxy ,abcy這些結果都符合
Eg:[root@buck ~]# grep "a*p" /etc/passwd
結果以下:紅色字體展示
.*:任意長度的任意字符;例子如上面「.」的例子
\+:匹配前面的字符至少1次;
grep "x\+y":
Xxxyabc yabc(不符合) abcxy abcy(不符合)
Eg:
\?:匹配前面的0次或1次,即前面的字符無關緊要;
grep "x\?y":
xxxyabc, yabc ,abcxy ,abcy都符合
eg: 注:此圖只是未截出含有ap的行
\{m\}:其前面的字符出現m次,m爲非負整數;
grep "x\{2\}y":
xxxyabc(符合) ,Yabc(不符合), abcxy(不符合), abcy(不符合)
Eg:以下紅色字體
\{m,n\}:其前面的字符出現m次,m爲非負整數;[m,n]
grep 「x\{2,3\}y」
Eg:以下紅色字體
\{0,n\}:至多n次;
\{m,\}:至少m次;
例子與上面的類同
位置錨定
限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪一個位置;
^:行首錨定;用於模式的最左側,^PATTERN
Eg:以apple開頭的行被檢測出來顯示
$:行尾錨定;用於模式的最右側,PATTERN$
Eg: 以bash結尾的行顯示出來
^PATTERN$:要讓PATTERN徹底匹配一整行;
^$:空行;
^[[:space:]]*$:
例子與上面雷同
單詞:由非特殊字符組成的連續字符(字符串)都稱爲單詞;
\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN
eg:以下紅色字體
\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定;
eg:
練習:
一、顯示/etc/passwd文件中不以apple開頭但不以bash結尾的行;
二、找出/etc/passwd文件中的三位或四位數;
~]# grep "\<[0-9]\{3,4\}\>" /etc/passwd
三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行;
~]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
四、找出"netstat -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
~]# netstat -tan | grep "LISTEN[[:space:]]*$"
五、找出"fdisk -l「命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;
~]# fdisk -l | grep "/dev/[sh]d[a-z]\>"
六、找出」ldd /usr/bin/cat「命令的結果中文件路徑;
~]# ldd /usr/bin/cat | grep -o "/[^[:space:]]\+"
分組與引用:
\(PATTERN\):將此PATTERN匹配到的字符看成一個不可侵害總體進行處理;
Note:分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中,這些變量是\1, \2, \3, ...
eg:
pat1\(pat2\)pat3\(pat4\(pat5\)pat6\)
說明:
\n:模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;(不是模式,而是模式匹配的結果)
\1:第一組括號中的pattern匹配到的字符串;
\2:第二組括號中的pattern匹配到的字符串;
……
eg:
He love his lover
He like his lover
He love his liker
He like his liker
l..e.*l..er
其結果爲:He love his lover
He like his lover
He love his liker
He like his liker
\(l..e\).*\1r
其結果爲:He love his lover
He like his liker
後向引用:引用前面的括號中的模式所匹配到的字符串;
經常使用選項之二:
-E, --extended-regexp:支持使用擴展正則表達式
-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
egrep: 支持使用擴展正則表達式的grep命令,至關於grep -E;
語法:
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式的元字符:
字符匹配:
.:任意單個字符
[ ]:範圍內的任意單個字符
[^ ]:範圍外的任意單個字符
例子與上面介紹grep的例子雷同,這裏就不一一列出
匹配次數:
*:任意次;
?:0次或1次;
+:1次或屢次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
位置錨定:
^:行首
$:行尾
\<, \b:詞首
\>, \b:詞尾
分組及引用:
(pattern):分組,括號中的模式匹配到的字符會被記錄於正則表達式引擎內部的變量中;
後向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
說明:egrep的正則表達式中的例子與grep中的基本相同,這裏就不一一列出
練習:
一、顯示/etc/passwd文件中不以bash結尾的行;
~]# egrep -v "bash$" /etc/passwd
二、找出/etc/passwd文件中的三位或四位數;
~]# egrep "\<[0-9]{3,4}\>" /etc/passwd
三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行;
eg:egrep 「^[[:space:]][a-z]+」 /etc/grub2.cfg
四、找出"netstat -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
五、找出"fdisk -l「命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;
六、找出」ldd /usr/bin/cat「命令的結果中文件路徑;
七、找出/proc/meminfo文件中,全部以大寫或小寫s開頭的行;至少用三種方式實現;
~]# egrep "^(s|S)" /tmp/meminfo
~]# grep "^[sS]" /tmp/meminfo
~]# grep -i "^s" /tmp/meminfo
八、顯示當前系統上root、centos或slackware用戶的相關信息;
~]# egrep "^(root|centos|slackware)\>" /etc/passwd
九、echo輸出一個絕對路徑,使用egrep取出其基名;
~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"
十、找出ifconfig命令結果中的1-255之間的整數;
~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
十一、添加用戶bash、testbash、basher及nologin,要求前三個用戶的默認shell爲/bin/bash,nologin的默認shell爲/sbin/nologin,然後找出其用戶名與shell名相同的用戶;
~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd