Linux“文本三劍客”之grep
grep,Global search REgular expression and Print out the line. 是Linux中常用的文本搜索工具,基于正則表達式(Regular Expression)和文本字符來編寫模式(Pattern),然后根據指定的模式對目標文本逐行進行匹配,打印匹配到的行。
- grep工具分類
- grep命令
- 正則表達式
(1) 基本正則表達式的元字符
(2) 擴展正則表達式的元字符- grep工具的應用實例
1. grep工具分類
grep工具共有三個:
- grep – 默認支持基本正則表達式BRE;
- egrep – 默認支持擴展正則表達式ERE;
- fgrep – 默認不支持正則表達式。
雖然工具由三種,但三者都可以通過選項來達到彼此的使用效果:
- grep
(1) grep -E:相當于egrep
(2) grep -F:相當于fgrep- egrep
(1) egrep -G:相當于grep
(2) egrep -F:相當于fgrep- fgrep
(1) fgrep -G:相當于grep
(2) fgrep -E:相當于egrep
所以一般只使用grep配合選項來達到不同的效果即可。
另外,如果需要進行文本搜索的是很大的文件,盡量使用fgrep或-F選項來直接匹配文本,不通過正則表達式處理,性能會有較大提高,f就是fast之意。
2. grep命令
- grep [OPTIONS] PATTERN [FILE…]
grep [OPRIONS] [-e PATTERN | -f FILE] [FILE…] - OPTIONS
–color=auto:高亮顯示匹配到的文本
-i:–ignore-case:忽略字符大小寫
-o:僅顯示匹配到的字符串本身,而非整行(默認顯示被模式匹配到的行)
-v:–invert-match:反向匹配,僅顯示不能被模式匹配到的行
-E:支持使用擴展的正則表達式
-q:–quiet,–silent:靜默模式,即不輸出任何信息
grep還可以顯示匹配到的行的上下文:
-A #:after:后#行
-B #:before:前#行
-C #:context:前后各#行
要用好grep等具有正則表達式引擎的工具,熟練應用正則表達式才是根本。
3. 正則表達式
正則表達式:Regular Expression,REGEXP。
正則表達式是由一類特殊字符及本本字符本身所編寫的模式,其中有些字符不表示其字面意義,而是用于表示控制或通配的功能。
正則表達式分為兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
(1) 基本正則表達式的元字符
- 字符匹配
.:匹配任意單個字符
[]:匹配指定范圍內的任意單個字符
[^]:匹配指定范圍外的任意單個字符
字符集:
[:digit:],[:lower:],[:upper:],[:alpha:],[:alnum:],[:punct:],[:space:],等等
- 次數匹配
用在要指定其出現次數的字符的后面,用于限制其前面字符出現的次數。。
*:匹配其前面的字符任意次
比如:.*:匹配任意長度的任意字符
?:匹配其前面的字符0次或1次,即其前面的字符是可有可無的
+:匹配其前面的字符1次或多次,即其前面的要出現至少1次
{m}:匹配其前面的字符m次
{m,n}:匹配其前面的字符至少m到n次 - 位置錨定
^:行首錨定:用于模式的最左側
$:行尾錨定:用于模式的最右側
如: ^PATTERN$:用PATTERN來匹配整行
^$:匹配空白行,這行不包含任意字符(連空格也沒有)
^[[:space:]]*$:空行或包含space的行
< 或 \b:詞首錨定:用于單詞模式的左側
> 或 \b:詞尾錨定:用于單詞模式的右側
如:\<PATTERN\>用于匹配完整單詞
這里強調一下LInux中單詞的含義:非特殊字符組成的連續字符(字符串)都稱為單詞。
即:如果有特殊字符或空格出現,則單詞中斷。
- 分組及引用
\(\):將一個或多個字符捆綁在一起,當做一個整體進行處理
如\(xy\)*z:表示匹配“xy”任意次
\#:后向引用,#表示序號,引用前面的分組括號中的模式所匹配到的字符
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配的字符
\3
…
(2) 擴展正則表達式的元字符
- 字符匹配
擴展正則表達式的字符匹配元字符和基本正則表達式相同。
- 次數匹配
擴展正則表達式的次數匹配元字符省去了反斜線\,更易讀:
*:任意次(即0,1,或多次)
?:0次或1次,其前的字符是可有可無的
+:其前字符至少1次
{m}:其前的字符m次
{m,n}:至少m次,至多n次 - 位置錨定
擴展正則表達式的位置錨定元字符和基本正則表達式相同。
- 分組及引用
擴展正則表達式的分組元字符省去了反斜線\,更易讀:
():分組
后向引用元字符和基本正則表達式相同
- “或”關系
擴展正則表達式比基本正則表達式多了一個“或”的元字符:
|:“或”
如:a|b:a或者b
C|cat:C或cat
(c|C)at:cat或Cat
4. grep工具的應用實例
- 顯示/proc/meminfo文件中以大寫或小寫S開頭的行;用兩種方式
第一種方式,直接使用grep工具:
[root@localhost ~]# grep '^[s,S]' /proc/meminfo
SwapCached: 0 kB
SwapTotal: 975868 kB
SwapFree: 975868 kB
Shmem: 4684 kB
Slab: 55728 kB
SReclaimable: 20580 kB
SUnreclaim: 35148 kB
第二種方式,先用cat,然后通過管道將命令結果交給grep處理:
[root@localhost ~]# cat /proc/meminfo | grep '^[s,S]'
SwapCached: 0 kB
SwapTotal: 975868 kB
SwapFree: 975868 kB
Shmem: 4684 kB
Slab: 55880 kB
SReclaimable: 20588 kB
SUnreclaim: 35292 kB
- 顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶
[root@localhost ~]# grep -v '/sbin/nologin$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
tomcat:x:91:91:Apache Tomcat:/usr/share/tomcat:/bin/nologin
hadoop:x:1500:1500::/home/hadoop:/bin/bash
8、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;[root@localhost ~]# grep '/bin/bash$' /etc/passwd
root:x:0:0:root:/root:/bin/bash
amandabackup:x:33:6:Amanda user:/var/lib/amanda:/bin/bash
hadoop:x:1500:1500::/home/hadoop:/bin/bash
9、找出/etc/passwd文件中的一位數或兩位數;[root@localhost ~]# grep -o "\<[[:digit:]]\{1,2\}\>" /etc/passwd
0
0
1
1
2
2
...
10、顯示/boot/grub2/grub.conf中以至少一個空白字符開頭的行[root@localhost ~]# grep '^[[:space:]]\+' /boot/grub2/grub.cfg
11、顯示/etc/rc.d/rc.local文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行[root@localhost ~]# grep '^#[[:space:]]\+[^[:space:]]' /etc/rc.d/rc.local
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
12、打出netstat -tan命令執行結果中以‘LISTEN’,后跟空白字符結尾的行[root@localhost ~]# netstat -tan | grep 'LISTEN[[:space:]]\+$'
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:25 :::* LISTEN
13、添加用戶bash, testbash, basher, nologin (此一個用戶的shell為/sbin/nologin),而后找出當前系統上其用戶名和默認shell相同的用戶的信息;[root@localhost ~]# grep -E "(\<[[:alnum:]]+\>).*\1$" /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
bash:x:1501:1501::/home/bash:/bin/bash
nologin:x:1504:1504::/home/nologin:/sbin/nologin
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98517
寫的不錯,加油