Linux上文本處理三劍客
- grep :文本過濾( 模式:pattern) 工具
- grep, egrep, fgrep (不支持正則表達式搜索,但搜索純文本的數據最快)
- sed :stream editor ,文本編輯工具
- awk :Linux上實際是gawk(GUN awk) ,文本報告生成器
正則表達式:
- 由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能
- 支持正則表達式的程序:grep, vim, less,nginx等
正則表達式分兩類:
- 基本正則表達式:BRE
grep ,egrep -G
- 擴展正則表達式:ERE
grep -E, egrep
正則表達式引擎:
- 采用不同算法,檢查處理正則表達式的軟件模塊
- PCRE(Perl Compatible Regular Expressions)
- 元字符分類:字符匹配、匹配次數、位置錨定、分組
grep
grep: Global search REgular expression and Print out the line.
作用:文本搜索工具,根據用戶指定的“模式”對目標文本逐行進行匹配檢查;打印匹配到的行; 模式:由正則表達式字符及文本字符所編寫的過濾條件
grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
--color=auto: 對匹配到的文本着色顯示; -v: 顯示不能夠被pattern匹配到的行; -i: 忽略字符大小寫 -n:顯示匹配的行號 -c: 統計匹配的行數,而不顯示匹配到的內容 -o: 僅顯示匹配到的字符串; -q: 靜默模式,不輸出任何信息 -A #:after,顯示匹配的行及其后#行 -B #: before,顯示匹配的行及其前#行 -C #:context,顯示匹配的行及其前后各#行 -e:實現多個選項間的邏輯or關系
grep –e 'cat' -e 'dog' file
-E:使用ERE 擴展的正則表達式
基本正則表達式元字符:
字符匹配:
.: 匹配任意單個字符; []: 匹配指定范圍內的任意單個字符 [^]:匹配指定范圍外的任意單個字符 [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次數:用在要指定次數的字符后面,用於指定前面的字符要出現的次數,默認工作在貪婪模式:盡可能長的匹配
* :匹配前面的字符任意次,包括0次
.* :任意長度的任意字符
\? :匹配其前面的字符0或1次
\+ :匹配其前面的字符至少1次,但不需要緊隨在第一次后面
\{m\} :匹配前面的字符m次
\{m,n\} :匹配前面的字符至少m次,至多n次
\{,n\} :匹配前面的字符至多n次
<=n次
\{m,\} :匹配前面的字符至少m次
>=m次
位置錨定:定位出現的位置
^ :行首錨定,用於模式的最左側 $ :行尾錨定,用於模式的最右側 ^PATTERN$: 用於模式匹配整行 ^$: 空行 ^[[:space:]]*$ :空白行或包含tab字符的行 \< 或 \b :詞首錨定,用於單詞模式的左側 \> 或 \b :詞尾錨定;用於單詞模式的右側 注意:在grep中,字母和數字的組合也被視為單詞 \<PATTERN\>:錨定以PATTERN表達式做為單詞的行
分組及引用
\(\):將1個或多個字符捆綁在一起作為一個整體進行處理 \(xy\)*ab:xy作為一個整體出現0此或多次 注意:分組括號中的模式匹配到的內容會被正則表達式引擎記錄與內部變量中,這些變量為: \1:模式從左側起,第一個左括號以及與其匹配的右括號之間的內容 \2:模式從左側起,第二個左括號以及與其匹配的右括號之間的內容 \3: …… 后向引用:引用前面的分組括號中的模式所匹配的字符,且引用中的數據和分組模式匹配到的數據是一樣
練習:
1、顯示/etc/passwd 文件中不以/bin/bash 結尾的行
# grep -v "/bin/bash$" /etc/passwd
2 、顯示用戶rpc 默認的shell 程序
# grep "^rpc\>" /etc/passwd | cut -d: -f7
3 、找出/etc/passwd 中的兩位或三位數
# grep -E "\<[0-9]{2,3}\>" /etc/passwd
4 、找出"netstat -tan" 命令的結果中以'LISTEN' 后跟0 、1或多個空白字符結尾的行
# netstat -tan | grep "\<LISTEN[[:space:]]*$"
egrep及擴展的正則表達式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE...]
選項:
-i,-o,-v,q,-A,-B,-C
-G:支持基本的正則表達式
擴展正則表達式元字符:
字符匹配:
.: 匹配任意單個字符; []: 匹配指定范圍內的任意單個字符 [^]:匹配指定范圍外的任意單個字符 [:digit:] [:lower:] [:upper:] [:alpha:] [:alnum:] [:punct:] [:space:]
匹配次數:用在要指定次數的字符后面,用於指定前面的字符要出現的次數,默認工作在貪婪模式,盡可能長的匹配
* :匹配前面的字符任意次,包括0次
.* :任意長度的任意字符
? :匹配其前面的字符0或1次
+ :匹配其前面的字符至少1次
{m} :匹配前面的字符m次
{m,n} :匹配前面的字符至少m次,至多n次
{,n} :匹配前面的字符至多n次
<=n次
{m,} :匹配前面的字符至少m次
>=m次
位置錨定:定位出現的位置
^ :行首錨定
$ :行尾錨定
^PATTERN$: 用於模式匹配整行
^$: 空行
^[[:space:]]*$ :空白行或包含tab字符的行
\< 或 \b :詞首錨定
\> 或 \b :詞尾錨定
注意:在grep中,字母和數字的組合也被視為單詞
\<PATTERN\>:錨定以PATTERN表達式做為單詞的行
分組及引用
():括號內模式會被記錄於正則表達式引擎中: 后向引用:\1,\2,\3...... 或者 a|b:a或者b eg:C|cat :表示C或者cat (C|c)at :表示Cat或者cat
練習:
1 、顯示當前系統上,root,gao和user1用戶的相關信息
# grep -E "\<(root|gao|uer1)\>" /etc/passwd
2 、統計以root 身份登錄的每個遠程主機IP
# who | grep -E "^root\>" | wc -l
3 、使用egrep 取出/etc/rc.d/init.d/functions
# echo "/etc/rc.d/init.d/functions" | grep -oE "[^/]+/?$"
