grep與正則表達式使用

 

grep簡介

grep 是一種強大的文本搜索工具,它能使用正則表達式搜索文本,並把匹配的行打印出來。一般grep有三種版本grep、egrep(等同於grep -E)和fgrep。egrep爲擴展的grep,fgrep則爲快速grep(固定的字符串來對文本進行搜索,不支持正則表達式的引用可是查詢極爲快速)。grep是Linux文本處理三劍客之一。git

grep使用方式

經常使用選項:  –color=auto:對匹配到的文本着色後進行高亮顯示;
-c:只輸出匹配的行數 
-i:匹配時忽略大小寫
-h:多文件匹配時不顯示文件名,默認顯示、
-l:只列出符合匹配的文件名,而不顯示匹配的行內容
-n:顯示行號、
-s:不顯示錯誤消息
-q:禁止輸出任何結果,以退出狀態表示搜索是否成功 $? 查看,值0或者1
-v:取反,顯示不包含匹配文件本的全部行
-o:只顯示被匹配到的字符串
-C n:顯示匹配字符先後面的行數
-A n:顯示匹配字符後面的行數
-B n:顯示匹配字符前面的行數 n:數值
-e : 實現多個參數之間的 ‘或’ 的關係 eg: grep -e root -e bash /ect/passwd
-w : 匹配單詞

注:使用grep匹配時需使用雙引號引發來(單引號爲強引用),防止被系統誤認爲參數或者特殊命令而報錯。正則表達式

擴展grep使用方式

使用方式:egrep [OPTIONS] PATTERN [FILE…]shell

或 grep -E [OPTIONS] PATTERN [FILE…]ruby

擴展正則表達式在基本正則表達式上進行了修改,主要取消反斜線轉移,更容易看bash

字符匹配:

.: 任意單個字符
[]: 指定範圍內的任意單個字符
[^]: 指定範圍外的任意單個字符

次數匹配:

*:匹配其前面的字符任意次;
?: 匹配其前面的字符0或1次;
+: 匹配其前面的字符至少1次
{m}: 匹配其前面的字符m次;
{m,n}: 至少m次,至多n次
{m,}: 至少m次;
{0,n}:至多n次;

錨定:

^: 行首
$: 行尾
\<, \b: 詞首
\>, \b:詞尾

分組:

(): 分組
|: 或者, ac|bc
grep -E "con(C|c)at" 匹配conCat或concat

grep基本正則表達式元字符

匹配次數

*:前一個字符出現任意次數,包括0次
.* :任意字符出現任意次數
\?:前一個字符出現1次或者0次
\+:出現1次或者1次以上
\{n\}:精確匹配次數
\{m,n\}:匹配m到n次之間
\{n,\} :匹配最少n次以上
\{,n\} :匹配最多n次以上
[a-z]\+ : 任意一個字符至少出現一次 ;
. 在[]中沒有任何意義,就是點自己

位置錨定

^ : 匹配行首
$ ; 匹配行尾
^$: 匹配空白行
[^]:取反匹配

分組

\(匹配內容\) :匹配括號內的內容
\n (數字) :重複前面匹配的內容再匹配
eg:匹配開頭行和結尾行同樣的行
[root@yufu ~]# grep "^\(.*\):.*/\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

後向引用:引用前面的分組括號中的模式所匹配到的字符 分組括號中的模式匹配到的內容或被正則表達式引擎自動記錄於內部的變量中: \1:模式從左側起,第一個左括號及與之匹配的右括號之間模式匹配到的內容 \2:模式從左側起,第二個左括號及與之匹配的右括號之間模式匹配到的內容…markdown

擴展正則表達式與正則表達式略有不一樣:
‘[]’:依舊匹配指定範圍內的任意單個字符;可是有不少特殊匹配方式。
[:digit:] 匹配任意單個數字
[:lower:] 匹配任意單個小寫字母
[:upper:] 匹配任意單個大寫字母
[:alpha:] 匹配任意單個字母
[:alnum:] 匹配任意單個字母或數字
[:punct:] 匹配任意單個符號
[:space:] 匹配單個空格
一些地方取消了轉義字符的使用:
‘?‘:匹配其前面的字符0次或者1次;
‘+’:匹配其前面的字符1次或者屢次;
‘{m}‘:匹配其前面的字符m次(\爲轉義字符)
‘{m,n}’:匹配其前面的字符至少m次,至多n次
():將一個或多個字符捆綁在一塊兒,當作一個總體進行處理,反向引用照常使用。
|’:或(注:‘C|cat’爲C與cat,‘(C|c)at纔是Cat與cat’)

一些例子

1.顯示/proc/meminfo文件中以大小寫s開頭的行
[root@localhost ~]#cat /proc/meminfo | grep -io "^[s].*"
SwapCached: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Shmem: 6900 kB
Slab: 36828 kB
SReclaimable: 18184 kB
SUnreclaim: 18644 kB
2.取出默認shell爲非bash的用戶
[root@localhost ~]#cat /etc/passwd | grep -v "[bash]$" | cut -d : -f 1
bin
daemon
adm
lp
sync
shutdown
halt
mail
operator
games
...省略...
3.取出默認shell爲bash的且其ID號最大的用戶
[root@localhost ~]#cat /etc/passwd | grep "bash$" | cut -d: -f 3 | sort -nr | head -1
1003
4.顯示/boot/grub/grub.conf中以致少一個空白字符開頭的行
[root@yufu ~]# cat /boot/grub/grub.conf | grep "^[[:space:]]\+"
root (hd0,0)
kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=96cb6b8f-c3da-41d1-a063-cfd0e8177085 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-696.el6.x86_64.img
5.找出/etc/passwd文件中一位數或兩位數
[root@yufu ~]# cat /etc/passwd | grep -o "\<[0-9][0-9]\>"
12
10
14
11
12
13
30
14
50
99
99
81
81
69
...省略...
6.找出ifconfig命令結果中全部ip地址
[root@yufu ~]# ifconfig | grep -o "[0-9.]\{7,\}"
192.168.214.187
192.168.214.255
255.255.255.0
127.0.0.1
255.0.0.0
7.添加用戶bash和testbash、basher,然後找出當前系統上其用戶名和默認shell相同的用戶
[root@yufu ~]# cat /etc/passwd | grep -E "^\<([[:alpha:]]{1,})\>:.*\1$"
或者:[root@yufu ~]# cat /etc/passwd | grep -E "^\<([a-zA-Z]{1,})\>:.*\1$"
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
8.統計/etc/rc.d/rc.sysinit文件中以#開頭的行的行數,以及空白行的行數
#開頭的行
[root@yufu ~]# grep "^#.*" /etc/rc.d/rc.sysinit | wc -l
44
#空行
[root@yufu ~]# grep "^$" /etc/rc.d/rc.sysinit | wc -l
100
9.利用df和grep,取出磁盤各分區利用率,並從大到小排序
[root@yufu ~]# df -h | grep "^/dev" | grep -o "[0-9]\+%" | grep -o "[0-9]\+" | sort -nr 
29
21
1
相關文章
相關標籤/搜索