Linux三劍客之grep 與 egrep

grep:
Linux上文本處理三劍客
1 grep:文本過濾(模式:pattern)工具; *grep, egrep, fgrep2 sed:stream editor,文本編輯工具;
3 awk:Linux上的實現gawk,文本報告生成器;

grep: Global search REgular expression and Print out the line.git

做用:
文本搜索工具,根據用戶指定的「模式」對目標文本逐行進行匹配檢查;打印匹配到的行;
模式:由正則表達式字符及文本字符所編寫的過濾條件;
REGEXP:由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示字符字面意義,而表示控制或通配的功能;
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep -E, egrep
 
正則表達式引擎
 1 選項:
 2                             --color=auto: 對匹配到的文本着色顯示;
 3                             -v: 顯示不可以被pattern匹配到的行;
 4                             -i: 忽略字符大小寫;
 5                             -o: 僅顯示匹配到的字符串;
 6                             -q: 靜默模式,不輸出任何信息;
 7                             -A #:after, 後#行
 8                             -B #: before, 前#行
 9                             -C #:context, 先後各#行
10 
11                             -E:使用ERE;

基本正則表達式元字符:正則表達式

字符匹配:shell

.:  匹配任意單個字符;
[]: 匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
 
匹配次數:用在要指定次數的字符後面,用於指定前面的字符要出現的次數;
*:匹配前面的字符任意次;
例如: grep "x*y" 
abxy
xay
xxxxxxy
 
貪婪模式
.*:任意長度的任意字符;
\?:匹配其前面的字符0或1次;即前面的無關緊要;
\+:匹配其前面的字符至少1次;
\{m\}:匹配前面的字符m次;
\{m,n\}:匹配前面的字符至少m次,至多n次;
\{0,n\}:匹配前面的字符至多n次;
\{m,\}:匹配前面的字符至少m次;
 
位置錨定:
^:行首錨定;用於模式的最左側;
$:行尾錨定;用於模式的最右側;
^PATTERN$: 用於模式匹配整行;
^$: 空行;
^[[:space:]]*$
 
\< 或 \b:詞首錨定;用於單詞模式的左側;
\> 或 \b:詞尾錨定;用於單詞模式的右側;
\<PATTERN\>:匹配整個單詞;
 
分組:
\(\):將一個或多個字符捆綁在一塊兒,看成一個總體進行處理;
\(xy\)*ab
 
Note: 分組括號中的模式匹配到的內容會被正則表達式引擎記錄於內部的變量中,這些變量的命名方式爲: \1, \2, \3, ...
\1: 從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\(ab\+\(xy\)*\):
\1: ab\+\(xy\)*
\2: xy
 
後向引用:引用前面的分組括號中的模式所匹配字符,(而非模式自己)
練習實例
一、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
1 # grep '^{s|S}' /proc/meminfo
2 # grep -i '^s'  /proc/meminfo

二、顯示/etc/passwd文件中不以/bin/bash結尾的行;express

1 # grep -v '/bin/bash$'  /etc/passwd

三、顯示/etc/passwd文件中ID號最大的用戶的用戶名;centos

1 # sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1

四、若是用戶root存在,顯示其默認的shell程序;bash

1 # id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7

五、找出/etc/passwd中的兩位或三位數;工具

1 # grep "\<[0-9]\{2,3\}\>" /etc/passwd

六、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存非空白字符的行;spa

1 # grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit

七、找出"netstat -tan"命令的結果中以'LISTEN'後跟0、1或多個空白字符結尾的行;code

# netstat -tan | grep "LISTEN[[:space:]]*$"

八、添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin);然後找出/etc/passwd文件中用戶名同shell名的行;blog

1 # grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd

egrep及擴展的正則表達式

egrep = grep -E

擴展正則表達式的元字符:
字符匹配:
.
[]
[^]
次數匹配:
*
?: 0或1次;
+:1次或屢次;
{m}:匹配m次;
{m,n}:至少m,至多n次;
錨定:
^
$
\<, \b
\>, \b
分組:
()
 
後向引用:\1, \2, ...
或者:
a|b
C|cat: C或cat
練習實例
一、顯示當前系統root、centos或user1用戶的默認shell和UID;
1 # grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7

二、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞後面跟一個小括號的行;

# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions

三、使用echo輸出一絕對路徑,使用egrep取出其基名;

1 # echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
相關文章
相關標籤/搜索