grep命令是linux下的行過濾工具,參數繁多,功能比較強大,用起來比較方便,下面就將grep及其egrep分模塊講述其功能。
1.Grep:根據模式搜索文本,並將符合模式的文本行顯示出來
2.Grep的語法:Grep [option] PATTERN [file…]
Pattern: 文本字符和正則表達是元字符組合而成匹配條件
3.grep的常用選項:
-i: 不區分字符的大小寫(只適用於單字符);
-I:字符的大寫;
--color: 匹配的串用高亮顏色顯示;
alias grep='grep --color'
-v: 顯示沒有被模式匹配到的行;
-o: 只顯示被模式匹配到的字符串;
-n:顯示匹配行及行號;
-s:不顯示不存在或沒有匹配文本的錯誤信息;
-E:擴展正則表達式;
-A|B #:顯示前(後)兩行;
-C#:前後幾行;
-e: 制定多個匹配模式
Eg1:在/etc/passwd 下 找到有root 和home關鍵字並統計下來。
[root@chang ~]# grep -e root -e home -c /etc/passwd
4.基本正則表達式元字符:
4.1 grep字符匹配:
[]:指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
. :匹配任意單個字符
[:digit:]數字[:space:]空白 [:lower:]小寫字母 [:upper:]大寫字母 [:alpha:]代表字母 [:alnum:]代表字母與數字字符
4.2 grep匹配次數(貪婪模式):用在要制定次數的字符後面,用於制定前面的字符要出現的次數;
*:匹配其前面的字符的任意次
.* :任意長度的任意字符
\?:匹配其前面的字符1次或0次
\+: 匹配其前面的字符至少一次;
\{m\}:匹配前面的字符m次;
\{m,n\}: 匹配其前面的字符至少m次最多n次;( egrep匹配{m,n}時:不再需要\\;)
\{0,n\} :匹配前面的字符最多n次;
\{m,\} :匹配前面的字符至少m次;
Eg2:匹配file中a最多3次做少1次的字符
Grep 'a\{1,3\}b' file
5.grep的位置錨定:
^ :錨定行首,用於模式的最左側;
$:錨定行尾,用於模式的最右側;
^PATTERN$ :用於模式匹配整行;
^$:空行 ^[[:space:]]*$
\<|\b:其後面的任意字符必須作爲單詞的首部出現(出現單詞模式的左側)即單詞的開頭;
\>|\b:其前面的任意字符必須作爲單詞的尾部出現(出現在單詞模式的右側)即單詞的結尾;
\<PATTERN\>:匹配整個單詞;
6.grep的分組:
\(\) 將一個或多個字符捆綁在一起,當做一個整體進行處理;
\(ab\)* :ab可以出現的任意次數
Note :分組括號中的模式匹配到的內容會被正則表達式引擎記錄與內部的變量中;這些變量的命令方式爲: \1,\2,\3…
\1:從左側起,第一個左括號以及與之匹配右括號之間的模式所匹配到的字符;
\2:第二個。。。
\3:第三個。。。
以下幾個綜合性的練習題來練練手:
1>.顯示/proc/meminfo文件中以大小s開頭的行:
[root@chang ~]# grep '^[Ss]' /proc/meminfo
[root@chang ~]# grep -i '^s' /proc/meminfo
2>.顯示/etc/passwd文件中不以/bin/bash結尾的行:
[root@chang ~]# grep -v '/bin/bash$' /etc/passwd
3>.顯示/etc/passwd文件中ID號最大的用戶的用戶名:
[root@chang ~]# sort -t: -k3 -n /etc/passwd | tail -1 | cut -d: -f1
4>.如果用戶root存在,顯示其默認的shell程序:
[root@chang ~]# id root &> /dev/null && grep "^root\>" /etc/passwd | cut -d: -f7
/bin/bash
**先判斷root用戶是否存在,再顯示其默認的shell
5>.找出/etc/passwd中的兩位或三位數:
[root@chang ~]# grep "\b[0-9]\{2,3\}\b" /etc/passwd
6>. 顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且後面存在非空白字符的行:
[root@chang ~]# grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit
7>.找出“netstat -tan”命令的結果中以‘LISTEN’後跟0、1或多個空白字符結尾的行:
[root@chang ~]# netstat -tan | grep "LISTEN[[:space:]]*$"
8>. 添加用戶bash、testbash、basher以及nologin(其shell爲/sbin/nologin):而後找出/etc/passwd文件中用戶名同shell名的行:
[root@chang ~]# ls /home
bash chang nologin test testbash (已添加所需要的用戶)
[root@chang ~]# grep "^\([[:alnum:]]\+\>\).*\1$" /etc/passwd
7.Grep -E=egrep
7.2.次數匹配:
* :
? :0或1次;
+ :匹配其前面字符至少一次;
7.3.位置錨定:
其他與grep一樣
\<(\b):詞首
\>(\b):詞尾
7.4.分組:
():
向後引用: \1,\2,\3:
Eg3: a |b:a or b
C|cat : C 或 cat
(C|c)at :Cat或者cat
Eg4:尋找1-255之間的整數
egrep --color '\<([1-9][1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>' file
fgrep:不支持正則表達式搜索,查詢速度比grep命令快,但是不夠靈活:它只能找到固定的文本,而不是規則表達式。