grep、egrep搜索工具git
你知道怎樣在文本中檢索出本身須要的數據嗎?正則表達式
對,grep,egrep命令能夠作到的不單單是這些,讓我來介紹一下吧。shell
grep、egrep是什麼?centos
grep、egrep都是文本搜索工具bash
grep、egrep能作什麼?ide
1)根據用戶指定的」pattern(過濾條件)「對目標文本逐行進行匹配檢查;工具
2)打印出符合條件的行。ui
你確定在想grep,egrep是什麼關係?spa
egrep是支持使用擴展正則表達式的grep命令。至關於grep -Eregexp
grep命令用法介紹:
grep [OPTIONS](注:選項) PATTERN(注:過濾條件) [FILE...](檢索的文本文件)
選項1:
--color=auto: | 對匹配到的文本着色後高亮顯示 |
-i | 忽略字符大小寫; |
-o | 僅顯示匹配到的文本自身; |
-v | --invert-match:反向匹配; |
-E | 支持擴展的正則表達式; |
-q, --quiet, --silient | 靜默模式,不輸出任何信息; |
基本正則表達式的原字符介紹(注:咱們的過濾條件是由文本字符及正則表達式元字符所編寫的。)
1.字符匹配類:
.:匹配任意單個字符;
[ ]:匹配範圍內的任意單個字符;
[^ ]:匹配範圍外的任意單個字符;
字符集 [:digit:] 全部數字 ,[:lower:]全部小寫字母, [:upper:]全部大寫字母, [:alpha:]全部字母, [:alnum:]全部的字母和數字,[:space:]全部空白字符, [:blank:]空白, [:punct:]全部標點符號
2.匹配次數類:
用在要指定其出現的次數的字符後面,用限制其前面的字符要出現的次數;默認工做於貪婪模式。
*:匹配前面的字符任意次(0,1或屢次);
例如:grep "x*y" a2 注:只要含有y的均可以匹配到
.*:任意長度的任意字符;
例如:grep 「^x.*y」 a2 注:.*表示以x開頭中間跟上任意字符並含有y的字符將被匹配。
\+:匹配前面的字符至少1次;
例如:grep 「^[[:space:]]\+[[:space:]]」 /etc/grub2.cfg 注:\+匹配行首的空白行出現1次及以上
\?:匹配前面的0次或1次,即前面的字符無關緊要;
例如:grep "x\?y" 注:只要是含有y的均可以匹配到
例如:grep "\<[0-9]\{2\3}\>" /etc/passwd 注:匹配文件中至少2位至多3位的數字。
\<:牟定詞首 \>:牟定詞尾,用來限定匹配完整單詞的。
\{0,n\}:至多n次;
\{m,\}:至少m次;
3.位置錨定類:
限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪一個位置;
^:行首錨定;用於模式的最左側, 例如:grep 「^s」 a1 注:s開頭的行
$:行尾錨定;用於模式的最右側,PATTERN$ 例如:grep 「s$」a1 注:s結尾的行
^PATTERN$:要讓PATTERN徹底匹配一整行; 例如: grep 「^xy$」a2 注:只有xy的行
^$:空行; 例如:grep 「^$」 a2 注:找出a2中的空行
^[[:space:]]*$:空行或者包含空白字符的行 例如:grep "^[[:space:]]*$" a2
\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN
\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定;單詞:由非特殊字符組成的連續字符(字符串)都稱爲單詞;
4.分組與引用類:
\(PATTERN\):將此PATTERN匹配到的字符看成一個不可侵害總體進行處理;
Note:分組括號中的模式匹配到的字符會被正則表達式引擎自動記錄於內部的變量中,這些變量是\1, \2, \3, ...
\(pat2\)pat3\(pat4\(pat5\)pat6\)
注:\1是\(pat2)模式匹配的結果的引用。 \2是\(pat4\(pat5\)的引用
\n:模式中第n個左括號以及與之匹配的右括號之間的模式所匹配到的字符串;(不是模式,而是模式匹配的結果)
\1:第一組括號中的pattern匹配到的字符串;
\2:第二組括號中的pattern匹配到的字符串
egerp介紹
egrep [OPTIONS] PATTERN [FILE...]
選項2
-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的正則元字符介紹
總結: 相同點:在字符匹配類和錨定類是同樣的。
不一樣點: 匹配次數類和分組引用類,各字符的控制語意同樣,寫法上擴展上少寫了\。分組引用引出了或的機制
匹配次數:
*:任意次;
?:0次或1次;
+:1次或屢次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}:至多n次
{m,}:至少m次
分組及引用:
(pattern):分組,括號中的模式匹配到的字符會被記錄於正則表達式引擎內部的變量中;
後向引用:\1, \2, ...
例如:或者:a|b:a或者b C|cat:表示C或cat (C|c)at:表示Cat或cat
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
練習提高
一、顯示/etc/passwd文件中不以bash結尾的行;
~]# egrep -v "bash$" /etc/passwd
二、找出/etc/passwd文件中的三位或四位數;
~]# egrep "\<[0-9]{3,4}\>" /etc/passwd
三、找出/etc/grub2.cfg文件中,以致少一個空白字符開頭,後面又跟了非空白字符的行;
grep -E "^[[:space:]]+[[:space:]]" /etc/grub.cfg
四、找出"netstat -tan」命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
netstat -tan | grep -E "LISTEN[[:space:]]*$"
五、找出"fdisk -l「命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;
fdisk -l | egrep "/dev/(sd|hd)[[:lower:]]"
六、找出」ldd /usr/bin/cat「命令的結果中文件路徑;
ldd /usr/bin/cat | grep -E "[/]+.*"
七、找出/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