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