grep/egrep ((Extend)Global standard Research Expression Print out the line),grep/egrep是一種文本搜索工具,可以通過使用指定的通配符/正則表達式來實現文本搜索功能。下面我們就來說一說在grep中的正則表達式。
1、[ ] 指定範圍內的任一字符,需要注意的是這裏所匹配的只是中括號內的任意一個字符,比如[2$sdN7],只能匹配2、$、s、d、N、7這些中的一個。
eg: grep [2$sdN7] /rc.d/rc.sysinit
匹配並顯示 /rc.d/rc.sysinit 文件中包含 [2$sdN7] 任意字符的行。
[0-9],指匹配包含0、1、、9的任意數字的行,也可以書寫爲 [[:digit:]]
[a-z],指匹配包含a、b、、z的任意字母的行,也可以書寫爲 [[:lower:]]
[A-Z],指匹配包含A、B、、Z的任意字母的行,也可以書寫爲 [[:upper:]]
[^],指匹配中括號給定字符之外的任意數字、字母或符號等
[[:alpha:]],指匹配所有的字母,等同於[[:lower:][:upper:]]、[a-z,A-Z]
[[:alnum:]],指匹配所有的字母加數字,等同於[[:lower:][:upper:][:digit:]]、[a-z,A-Z,0-9]
[[:space:]],指匹配並顯示包含空格的行
[[:punct:]],指匹配並顯示包含標點符號的行
以上所有對象都可以任意組合使用,將以上簡單的對象根據需求進行正確的組合,並結合以下操作對象的符號,即可實現複雜的功能:
*:匹配*之前的對象任意次
eg:grep x*y /etc/passwd
可以匹配包含xxy、xy、y的所有的行
.*:匹配任意長度的任意字符
\?:匹配此符號前面的對象,且該對象只能出現1次或0次
\{m\}:匹配此符號前面的對象,且該對象只能出現m次
\{m,n\}:匹配此符號前面的對象,且該對象最少出現m次,最多出現n次
\{m,\}:匹配此符號前面的對象,且該對象至少出現m次
\{0,n\}:匹配此符號前面的對象,且該對象至多出現出現n次,匹配0次也將顯示出來
以上對象需用“”雙引號來進行引用(做變量換算需要使用“”)
除以上對象操作符之外還有一些位置錨定操作符
^:錨定行首
^VarChar
$:錨定行尾
VarChar$
^$:表示空白行
單詞的位置錨定
\<char:錨定單詞首
char\>:錨定單詞尾
單詞的錨定符號可以分開使用
分組:
\( \)
eg:\(ab\) 指匹配包含“ab“字符的行
引用:
\#
\1:後向引用,引用第一個分組所匹配的內容,來進行二次匹配
引用前面的第一個左括號以及與之對應的右括號中的模式匹配到的內容,意思是說前面出現一次,在\1這也要出現一次
“引用”只能和“分組”一起用
詳細講解了正則表達式,下面我們來講一下egrep/grep的使用方法
格式:grep [options] 'PATTERF' file,默認只支持基本正則表達式,要匹配額外功能的字符用-E
選項:
--color 將被模式匹配到的字串以紅色顯示
-v:反向匹配,顯示不能被模式匹配到的行
-o:僅匹配被模式匹配到的字串,而非整行
-i:不區分大小寫,ignore-case
-E:支持擴展 egrep = grep -E
-A #:還顯示模式下面的#行
-B #:還顯示模式上面的#行
-C #:前後各顯示#行
egrep與grep使用的方式大致相同,只是大部分正則表達式可以不使用“\“逃逸符號,詳解如下:
egrep:使用擴展正則表達式來構建模式,相當於 grep -E
字符匹配:
.:任意單個字符
[ ]:指定範圍內的任意單個字符
[^]:指定範圍外的任意單個字符
次數匹配
*:匹配器前面的字符任意次
?:匹配器前面的字符0或1次
+:匹配其前面字符至少一次
{m}:匹配其前面字符m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:只讀n次
分組:
():分組
|:或者,ac|bc ac或者bc那個呢
區別分析:相應的次數匹配不再需要逃逸符號”\"(且不可添加),如:\{m\}可以寫爲{m}等,分組\( \)可以寫爲( )
而且新增 “|” “或者”與”+“”至少匹配一次“這兩個操作符
注意:單詞錨定符號 \< \>依然不可省略,切記。
除grep、egrep還有fgrep工具,但是fgrep不支持正則表達式,很少應用,故不再提及。
以下爲筆者提供的正則表達式示例,以供參考:
1、顯示/proc/meminfo文件中的以大小寫s的開頭的行
grep -i "^s" /proc/meminfo2、取出默認shell爲非bash的用戶
grep -v "bash$" /etc/passwd |cut -d: -f13、取出默認shell爲bash的且其ID號最大的用戶
grep "bash$" /etc/passwd |cut -d: -f1|sort -n -t: -k3|tail -14、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,後面跟至少一個空白字符,而後又有至少一個非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit5、顯示/boot/grub/grub.conf中以至少一個空白字符的行
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf6、查出/etc/passwd中一位數或兩位數
grep --color=auto "\<[0-9]\{1,2\}\>" /etc/passwd7、找出ifconfig命令結果中的1到255之間的整數
ifconfig |grep -E --color=auto "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"8、查看當前系統上root用戶的所有信息
grep “\<root\>”/etc/passwd9、添加用戶bash和testbash,而後找出當前系統上於其他用戶名和默認shell相同的用戶
grep “^\([[:alnum:]]\{1,\}\)\>.*\1$” /etc/passwd10、找出netstat -tan命令執行的結果中以“LISTEN”或“ESTABLISHEN”結尾的行
11、取出當前系統上所有用戶的shell,要求:每種shell中顯示一次,且升序排序顯示
metstat -tan |grep -E “(LISETN|ESTABLISHED)[[:space:]]*"
cut -d: -f7 /etc/passwd|sort -u