grep/egrep和正则表达式汇总
grep, egrep, fgrep
語(yǔ)法格式:
grep [option] ... 'PATTERN' FILE
--color=auto
對(duì)目標(biāo)FILE進(jìn)行搜索,顯示能夠匹配的行
正則表達(dá)式
基本正則: grep
擴(kuò)展正則: grep -E 或者 egrep
fgrep: fast但是不支持正則表達(dá)
基本正則表達(dá)式的元字符:
字符匹配:?
. ?匹配任意單個(gè)字符
[] 匹配指定范圍內(nèi)的單個(gè)字符
[0-9], [[:digit:]] 單個(gè)數(shù)字
[a-z], [[:lower:]] 單個(gè)小寫(xiě)字符
[A-Z], [[:upper:]] 單個(gè)大寫(xiě)字符
[[:space:]] 單個(gè)空白字符
[[:punct:]] 單個(gè)標(biāo)點(diǎn)符號(hào)
[[:alpha:]] 單個(gè)字母
[[:alnum:]] 單個(gè)字母或者數(shù)字
[^] 表示取反
次數(shù)匹配元字符: 用于實(shí)現(xiàn)指定其前面的字符所能夠出現(xiàn)的次數(shù)
* ?任意長(zhǎng)度, 他前面的字符可以出現(xiàn)任意次
例如: x*y
可匹配: xy, xyy, y
\? 0次或1次, 它前面的字符是可有可無(wú)的
例如: x\?y
可匹配: xy, y, ay
\{m\} ?m次, 它前面的字符要出現(xiàn)m次
例如: x\{2\}y
可匹配: xxy, xxxy
\{m,n\} 至少m次,至多n次
例如: x\{2,5\}y
可匹配: xxy, xxxy, xxxxy, xxxxxy
\{m,\} 至少m次
\{0,n\} 至多n次
.* 任意長(zhǎng)度的任意次
工作于貪婪模式: 盡可能多的去匹配
位置錨定:
^ 行首錨定:
寫(xiě)在模式最左邊
$ 行尾錨定:
寫(xiě)在模式最右邊
^$ 空白行
單詞 - 不包含特殊字符的連續(xù)字符組成的串
\< 詞首, 出現(xiàn)于單詞左側(cè)
\> 詞尾, 出現(xiàn)于單詞右側(cè)
分組:
\(\)
例如: \(ab\)*
可匹配 ?ababababab
分組中的模式匹配到的內(nèi)容, 可由正則表達(dá)式引擎記憶在內(nèi)存中,之后可被引用
引用:
例如 \(ab\(x\)y\).*\(mn\)
括號(hào)是有編號(hào)的, 自左向右的左括號(hào),以及與其匹配的右括號(hào)中間的內(nèi)容
數(shù)左括號(hào)
\# 引用第n個(gè)括號(hào)所匹配到的內(nèi)容, 而非模式本身
例如 \(ab\?c\).*\1
這里的\1 代表的是\(ab\?c\) 匹配到的內(nèi)容
比如abcxxxxabc,可以被匹配到
先匹配abc,然后正則將分組中匹配到的abc記錄到內(nèi)存中,匹配.*, 然后繼續(xù)調(diào)用\1,為abc才匹配
abcmnaaa
abcmnabc
abcmnac
acxyac
或者:
(|)
a|b: a或者b
命令選項(xiàng):
-v: 反向選取
eg: 全選非空白行 grep -v "^$" /etc/issue
-o: 僅顯示匹配的字符串,而非字符串所在的行
-i: 忽略字符大小寫(xiě)
-i "cat" 則每一個(gè)字符都不區(qū)分大小寫(xiě), Cat CAt cAt cAT都滿足
-E: 支持使用擴(kuò)展正則表達(dá)式
-A # 同時(shí)顯示匹配內(nèi)容的后一行
-B # 同時(shí)顯示匹配內(nèi)容的前一行
-C # 同時(shí)顯示匹配內(nèi)容的前后各一行
練習(xí):
1、顯示/proc/meminfo文件中以大寫(xiě)或小寫(xiě)S開(kāi)頭的行;
#grep "^[sS]" /proc/meminfo
#grep -i "^s" /proc/meminfo
#grep -E "^(s|S)" /proc/meminfo
2、顯示/etc/passwd文件中其默認(rèn)shell為非/sbin/nologin的用戶;
#grep -v "/sbin/nologin" /etc/passwd
3、顯示/etc/passwd文件中其默認(rèn)shell為/bin/bash的用戶;
進(jìn)一步:僅顯示上述結(jié)果中其ID號(hào)最大的用戶;
#grep "bin/bash" /etc/passwd
#grep "bin/bash" /etc/passwd | sort -n -t: -k3 | tail -1
4、找出/etc/passwd文件中的一位數(shù)或兩位數(shù);
#grep "\<[0-9][0-9]\?\>" /etc/passwd
5、顯示/boot/grub/grub.conf中以至少一個(gè)空白字符開(kāi)頭的行;
# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf?
6、顯示/etc/rc.d/rc.sysinit文件中,以#開(kāi)頭,后面跟至少一個(gè)空白字符,而后又有至少一個(gè)非空白字符的行;
#grep "^#[[:space:]]\{1,\}[^[:space:]]\{1,\}" /etc/rc.d/rc.sysinit
7、找出netstat -tan命令執(zhí)行結(jié)果中以'LISTEN'結(jié)尾的行;
#netstat -tan | grep "LISTEN$" ? ???
8、添加用戶bash, testbash, basher, nologin(SHELL為/sbin/nologin),而找出當(dāng)前系統(tǒng)上其用戶名和默認(rèn)shell相同的用戶;
#grep "^\([[:alnum:]]\{1,\}\):.*\1$" /etc/passwd
先錨定行首,匹配至少一個(gè)數(shù)字或字母,并分組,加上第一個(gè):,然后任意字符,最后行尾匹配\1
9、擴(kuò)展題:新建一個(gè)文本文件,假設(shè)有如下內(nèi)容:
He like his lover.
He love his lover.
He like his liker.
He love his liker.
找出其中最后一個(gè)單詞是由此前某單詞加r構(gòu)成的行。
=====================================================================
練習(xí):使用擴(kuò)展的正則表達(dá)式
10、顯示當(dāng)前系統(tǒng)上root、fedora或user1用戶的默認(rèn)shell;
#egrep 'root|richie|jingming' /etc/passwd | cut -d: -f7
11、找出/etc/rc.d/init.d/functions文件中某單詞后跟一組小括號(hào)“()”行;
#grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
12、使用echo命令輸出一個(gè)路徑,而后使用grep取出其基名;
#echo "/etc/sysconfig" | grep -E "[^/]+/?$"
非反斜線的字符至少。*一個(gè)匹配到行尾
13、找出ifconfig命令結(jié)果中的1-255之間的數(shù)字;
#ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
14、挑戰(zhàn)題:寫(xiě)一個(gè)模式,能匹配合理的ipv4地址;
1.0.0.1-239.255.255.255
============================================================================
博客作業(yè), 寫(xiě)清楚grep和egrep的各個(gè)元字符的意義和給出實(shí)例說(shuō)明用法
基本正則表達(dá)式:
字符匹配:
. ?匹配單個(gè)任意字符?
[] 匹配指定范圍內(nèi)的任意單個(gè)字符
[^]匹配到的內(nèi)容取反
eg: [^M]?
次數(shù)匹配:
* 在*符號(hào)的前一個(gè)字符可以出現(xiàn)任意次
\? 在\?符號(hào)的前一個(gè)字符可以出現(xiàn)0次或者1次
\{m\} 在\{m\}符號(hào)之前的那個(gè)字符,必須出現(xiàn)m次
\{m,n\} 在\{m,n\}符號(hào)之前的那個(gè)字符,可以出現(xiàn)最少m次,最多n次
\{m,\} 在\{m,\} 符號(hào)之前的那個(gè)字符, 至少出現(xiàn)m次
\{0,n\} 在\{0,n\} 符號(hào)之前的那個(gè)字符,至多出現(xiàn)n次
.* 匹配任意長(zhǎng)度的任意字符
工作于貪婪模式,系統(tǒng)會(huì)盡可能的去多匹配符合的
位置錨定
^ 錨定行首
$ 錨定行尾
^$ 錨定空行
單詞: 不包含特殊字符的連續(xù)字符組成的串
\< 詞首, 出現(xiàn)于單詞的左側(cè) \b也可
\> 詞尾, 出現(xiàn)于單詞的右側(cè) \b也可
分組:
\(\)?
分組中的模式匹配到的內(nèi)容, 可以又正則表達(dá)式引擎記憶在內(nèi)存中, 之后可以再次以 \#的形式被引用
引用:
()是有編號(hào)的: 自左向右的左括號(hào),以及與其匹配的右括號(hào)
\#: 引用第n個(gè)括號(hào)所匹配到的內(nèi)容,而非模式本身
例如文件內(nèi)內(nèi)容為:
abcmnxabcmnx
abcmnxbc
abcmnxc
abcmnxx
eg: \(a\(b\(c\)\)mn\(x\)\).*\#
\1 引用到的內(nèi)容就是\(a\(b\(c\)\)mn\(x\)\)匹配的內(nèi)容為
abcmnxabcmnx
\2 引用到的內(nèi)容就是\(b\(c\)\) 匹配到的內(nèi)容為
abcmnxbc
\3 引用到的內(nèi)容就是\(c\) 匹配到的內(nèi)容
abcmnxc
\4 引用到的內(nèi)容就是\(x\) 匹配到的內(nèi)容
abcmnxx
工作于貪婪模式,系統(tǒng)會(huì)盡可能的去多匹配符合條件的內(nèi)容。
所以實(shí)際上,一些子串也會(huì)被匹配到
grep命令
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN] -f [FILE] [FILE...]
-v 反向選取
-o 僅顯示匹配的字串, 而非字串所在的行
-i ignore-case, 忽略大小寫(xiě)
-E 支持使用擴(kuò)展正則表達(dá)式
-A # after-context
-B # before-context
-C # context
==================================================================
擴(kuò)展正則表達(dá)式:
字符匹配:
.
[]
[^]
次數(shù)匹配:
*
?
+
{m}
{m,n}
{m,}
{0,n}
位置錨定:
^
$
\<, \b
\>, \b
^$
分組:
()
引用: \1, \2, \3 ...
或者:
a|b a或者b
eg:conC|cat是 concat或conCat? ?no
還是conC 或cat?? ?yes
con(C|c)at 是conCat或concat
egrep命令
grep -E ?'PATTERN' FILE...
egrep 'PATTERN' FILE...
轉(zhuǎn)載于:https://blog.51cto.com/richier/1652946
總結(jié)
以上是生活随笔為你收集整理的grep/egrep和正则表达式汇总的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二维数组联通子数组和最大
- 下一篇: Linux学习之CentOS(三)---