linux下grep、egrep及相應的正則表達式和用法
一、簡介
Linux上文本處理三劍客(引用自馬哥教育 ):
grep, egrep, fgrep:文本搜索工具;基於”pattern“對給定文本進行搜索操作;
sed:Stream EDitor,流編輯器,行編輯工具;文本編輯工具;
awk:GNU awk,文本格式化工具;文本報告生成器;
grep (縮寫來自Globally search a Regular Expression and Print)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。Linux的grep家族包括grep、egrep和fgrep。
egrep命令是一個搜索文件獲得模式,使用該命令可以任意搜索文件中的字符串和符號,也可以爲你搜索一個多個文件的字符串,一個提示符可以是單個字符、一個字符串、一個字、一個句子。 (轉自百度百科)
二、詳解
grep命令
功能說明:查找文件裏符合條件的字符串。
補充說明:grep指令用於查找內容包含指定的範本樣式的文件,如果發現某文件的內容符合所指定的範本樣式,預設grep指令會把含有範本樣式的那一列顯示出來。若不指定任何文件名稱,或是所給予的文件名爲“-”,則grep指令會從標準輸入設備讀取數據。
參 數:
--color=auto:對匹配到的文本着色後高亮顯示;
-a或--text 不要忽略二進制的數據。
-c或--count 計算符合範本樣式的列數。
-C<顯示列數>或--context=<顯示列數>或-<顯示列數>
除了顯示符合範本樣式的那一列之外,並顯示該列之前後的內容。
-i或--ignore-case 忽略字符大小寫的差別。
-q或--quiet或--silent 不顯示任何信息。
-v或--revert-match 反轉查找。
-o:僅顯示匹配 到的文本自身;
-n或--line-number 在顯示符合範本樣式的那一列之前,標示出該列的列數編號。
-E或--extended-regexp 將範本樣式爲延伸的普通表示法來使用,支持擴展的正則表達式。
默認 grep 命令, 對匹配到的文本着色後高亮顯示,使用 -color=auto 選項。
使用 alias 命令,查看(如圖) :
用 grep命令查找 /etc/passwd 文件中 含有 “bash” 字符串的行 。
沒有使用 -v 選項的效果:
使用-v選項,進行反應查找的效果:
-i:忽略字符大小寫:
-q或--quiet或--silent 不顯示任何信息。
-o:僅顯示匹配 到的文本自身;
-c或--count 計算符合範本樣式的列數。
-C<顯示列數>或--context=<顯示列數>或-<顯示列數>
基本正則表達式元字符:
字符匹配:
.:匹配任意單個字符;
[ ]:匹配範圍內的任意單個字符;
[^ ]:匹配範圍外的任意單個字符;
[0-9] : 表示所有數字 等同於 [[:digit:]]
[a-z] : 表示所有小寫字母 等同於 [[:lower:]]
[A-Z] : 表示所有大寫字母 等同於 [[:upper:]]
[a-zA-Z] : 表示所有字母 等同於 [[:alpha:]]
[a-zA-Z0-9] : 表示字母和數字 等同於 [[:alnum:]]
[[:graph:]] : 表示非空字符(非空格、控制字符)
[[:cntrl:]] : 表示控制字符
[[:punct:]] : 表示標點符號
[[:print:]] : 表示非空字符(包含空格)
[[:space:]] : 表示空白字符
[[:digit:]] :表示所有數字
[[:lower:]] :所有小寫字母
[[:upper:]] :所有大寫字母
[[:alpha:]] :表示所有字母
[[:alnum:]] :表示所有 字母、數字
[[:punct:]] : 表示所有 標點 符號
匹配次數:
用在要指定其出現的次數的字符後面,用限制其前面的字符要出現的次數;默認工作於貪婪模式;
*:匹配前面的字符任意次(0,1或多次);
.*:任意長度的任意字符;
\+:匹配前面的字符至少1次;
\?:匹配前面的0次或1次,即前面的字符可有可無;
\{m\}:其前面的字符出現m次,m爲非負整數;
\{m,n\}:其前面的字符出現m次,m爲非負整數;[m,n]
\{0,n\}:至多n次;
\{m,\}:至少m次;
位置錨定:
限制使用模式搜索文本,限制模式所匹配到的文本只能出現於目標文本的哪個位置;
^:行首錨定;用於模式的最左側,^PATTERN
$:行尾錨定;用於模式的最右側,PATTERN$
^PATTERN$:要讓PATTERN完全匹配一整行;
^$:空行;
^[[:space:]]*$:
單詞:由非特殊字符組成的連續字符(字符串)都稱爲單詞;
\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN
\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定;
^:行首錨定;
$:行尾錨定;
^PATTERN$要讓PATTERN完全匹配一整行;
爲了方便截圖,小編 cp 了一份 passwd 到 /tmp 下,並向 passwd 添加內容:
第一行,爲root。
第二行,爲空白行。
"^$"爲空白行,"^root$":完全匹配含有root的一整行。
^[[:space:]]*$:
表示 兩邊 是 任意 數字 ,中間 任意字符的 。
效果一樣的。
\<或\b:詞首錨定,用於單詞模式的左側,格式爲\<PATTERN, \bPATTERN
\>或\b:詞尾錨定,用於單詞模式的右側,格式爲PATTERN\>, PATTERN\b
\<PATTERN\>:單詞錨定;
grep的分組:
\(\)
\(ab\):表示ab整體作爲匹配字符
\(ab\)* : 表示ab整體作爲匹配字符,且匹配任意次
\(ab\)\{1,\}:表示ab整體作爲匹配字符,且匹配至少一次
分組還可以後向引用
\1: 引用第一個左括號以及與之對應的右括號所包括的所有內容
\2: 引用第一個左括號以及與之對應的右括號所包括的所有內容
\3: 引用第一個左括號以及與之對應的右括號所包括的所有內容
如test有文本內容如下:
grep "\(l..e\).*\1r" test2 表示匹配結果如下:
egrep:
支持使用擴展正則表達式的grep命令,相當於grep -E;
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式的元字符:
字符匹配:
.:任意單個字符
[ ]:範圍內的任意單個字符
[^ ]:範圍外的任意單個字符
匹配次數:
*:任意次;
?:0次或1次;
+:1次或多次;
{m}:匹配m次;
{m,n}:至少m次,至多n次;
{0,n}
{m,}
位置錨定:
^:行首
$:行尾
\<, \b:詞首
\>, \b:詞尾
分組及引用:
(pattern):分組,括號中的模式匹配到的字符會被記錄於正則表達式引擎內部的變量中;
後向引用:\1, \2, ...
或者:
a|b:a或者b
C|cat:表示C或cat
(C|c)at:表示Cat或cat
練習:
1、顯示/etc/passwd文件中不以nologin結尾的行;
~]# egrep -v "nologin$" /etc/passwd
2、找出/etc/passwd文件中的含有root字符串的行;
3、找出/etc/grub2.cfg文件中,以至少一個空白字符開頭,後面又跟了非空白字符的行;
]# egrep "[^$]^[[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan”命令的結果中,以‘LISTEN’後跟0或多個空白字符結尾的行;
馬哥的:
5、找出"fdisk -l“命令的結果中,包含以/dev/後跟sd或hd及一個小字母的行;
6、找出”ldd /usr/bin/cat“命令的結果中文件路徑;
7、找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少用三種方式實現;
(一)
(二)
(三)
(四)
8、顯示當前系統上root、mageedu或yu用戶的相關信息;
9、echo輸出一個絕對路徑,使用egrep取出其基名;
~]# echo /etc/passwd/ | egrep -o "[^/]+/?$"
10、找出ifconfig命令結果中的1-255之間的整數;
~]# ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
11、添加用戶bash、testbash、basher及nologin,要求前三個用戶的默認shell爲/bin/bash,nologin的默認shell爲/sbin/nologin,而後找出其用戶名與shell名相同的用戶;
~]# egrep "^([[a-z0-9]+)\>.*\1$" /etc/passwd