grep(Globel Search Regular Expression and Printing out the line)全面搜索正則表達式并把行打印出來)是一個強大的文本搜索工具,使用正則表達式搜索文本的文本,并把結果打印出來。Unix家族包括grep、egrep和fgrep。egrep是擴張的正則表達式它支持更多的字符,fgrep是fast grep它不支持元字符搜索,但搜索速度更快。grep搜索結果不影響原文件。
grep命令
全面搜索正則表達式并把行打印出來
常用語法grep [OPTIONS] PATTERN [FILE…]
命令 選項 模式 文件
PATTERN 模式 是由正則表達式的元字符和普通字符所指定的過濾條件。
常用選項
-A NUM, –after-context=NUM#顯示匹配行的后NUM行
-B NUM, –before-context=NUM#顯示匹配行的前NUM行
-C NUM, -NUM, –context=NUM#顯示匹配行的前后NUM行
-E, –extended-regexp#擴張的正則表達式-n,
–line-number#顯示匹配的行號
-q, –quiet, –silent#靜默模式,不做任何輸出
-o, –only-matching #只顯示匹配到的行
–color[=WHEN], –colour[=WHEN]#匹配高亮顯示,cent6.#默認沒啟用
-c, –count #統計匹配的行數-i,
–ignore-case #忽略大小寫
-v, –invert-match#顯示不能夠被pattern到的行 (取反)
-w, –word-regexp#單詞匹配而不是字符
在使用grep前先了解了解正則表達式。正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
正則表達式的元字符可以做
字符匹配 匹配次數 位置錨定 分組
正則表達式使用的是貪婪模式,能匹配多長就盡量匹配多長
grep不加引號直接過濾字符串;grep在進行模式匹配的時候必須加引號,單引和雙引號都可以;grep在引用變量的時候必須加雙引號
如果要匹配特殊字符的話要使用\轉義來匹配特殊字符 如\$ \@等
字符匹配
. 匹配任意單個字符
[]匹配括號能指定的字符
[^]匹配括號外的指定字符
[alpha]:匹配所有字符
[:alnum:] 除了換行符外的所有字符
[:punct:] 所有標點符號
[:space:] 空格和tab
[:digit:] [0-9] 匹配所有數字
[:lowwer:][a-z] 匹配所有小寫字符
[:upper:] [A-Z] 匹配所有的大寫字符
匹配次數
* 匹配前面字符0次、1次或多次
.* 匹配任意長度任意字符
\? 匹配前面字符0次或1次
\+ 匹配前面字符至少一次或以上多次
\{m\} 匹配前面字符m次
\m,n\} 匹配前面字符最少m次,最多n次
\{,n\} 匹配前面字符做多n次\
{m,\} 匹配前面字符最少m次
位置錨定
^ 行首錨定,用于模式的最左側
$ 行尾錨定,用于模式的最右側
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b:詞首錨定,用于單詞模式的左側
\> 或\b:詞尾錨定;用于單詞模式的右側\<PATTERN\>:匹配整個單詞
分組\(PATTERN\) 將一個或多個字符捆綁在一起,當作一個整體進行處理。引用第一個小括號的分組\1,第二個是\2,以此類推。
示例
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
grep -i '^s' /proc/meminfo grep '^[sS] /proc/meminfo
2、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v '/bin/bash$' /etc/passwd
3、顯示用戶rpc默認的shell程序
grep '\<rpc\>' /etc/passwd|cut -d: -f7
4、找出/etc/passwd中的兩位或三位數
grep '\<[1-9][0-9]\{1,2\}\>' /etc/passwd
5、顯示/etc/grub.conf文件中,至少以一個空白字符開頭的且后面存非空白字符的行
grep '^[[:space:]]\+[^[:space:]]' /etc/grub.conf
6、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行
netstat -tan|grep '\<LISTEN[[:space:]]*'
7、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin),而后找出/etc/passwd文件中用戶名同shell名的行
grep '^\(.*\)\>.*\1$' /etc/passwd
egrep是擴展的正則表達式
即grep -E
常用語法grep [OPTIONS] PATTERN [FILE…]
命令 選項 模式 文件
egrep常用選項和字符匹配基本和grep就不多做解釋了
次數匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置錨定:
^ :行首錨定,用于行的最左側
$ :行尾錨定,用于行的左右側
\<, \b :詞首錨定。
\>, \b :詞尾錨定
?分組:
(pattern) 將一個或多個字符捆綁在一起,當作一個整體進行處理。引用第一個小括號的分組\1,第二個是\2,以此類推。
后向引用:\1, \2, …
或者:
a|b :a或b
C|cat: C或cat
(C|c)at:Cat或cat
示例
1、顯示當前系統root、mage或wang用戶的UID和默認shell
egrep '^root\>|^mage\>|^wang\>' /etc/passwd|cut -d: -f3,7
?2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行
egrep '[[:alnum:]_]\(\)' /etc/rc.d/init.d/functions
?3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions " |egrep -o '(.*/)+(.*)\1'
?4、使用egrep取出上面路徑的目錄名
echo "/etc/rc.d/inittab/functions" |grep '[^/]\+/\?$'
?5、統計以root身份登錄的每個遠程主機IP地址的登錄次數
last |egrep –color=auto '^root\>.*(.*\.){3}[0-9]{3}\> '
|tr -s ' '|cut -d' ' -f3|sort |uniq -c
?6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255
egrep '\<[0-9]\>' :0-9
egrep '\<[1-9][0-9]\>' :10-99
egrep \<1[0-9]{2}\>:100-199
egrep \<2[0-4][0-9]\> :200-249
egrep \<25[0-5]\>:250-255
?7、顯示ifconfig命令結果中所有IPv4地址
egrep '((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-4]|[01]?[0-9][0-9]?)'
原創文章,作者:ladsdm,如若轉載,請注明出處:http://www.www58058.com/33743