一 、 grep及egrep的基本介紹:linux
首先咱們要知道grep的這個命令的自己意思即:git
grep [Global search REgular expression and Print out the line ] 全局搜索正則表達式匹配到的內容,而且打印出匹配內容所在行正則表達式
grep 是一個很經常使用可是也很強大的搜索工具,它是以正則表達式爲基礎,搜索文本文件中符合要求的字符串,而且顯示所匹配的字符串所在行。express
grep搜索的內容是以一行來顯示的,固然咱們可使用一些特別的選項來只顯示咱們所匹配到的內容,這個稍後會爲你講解到,grep通常會與(|)管道apache
像結合使用,grep+基本正則表達式+管道 則是咱們在實際操做中用到最多的組合。bash
2、 grep 命令的使用方法app
使用語法格式: ide
grep [OPTIONS] PATTERN [FILE...]工具
-c:只輸出匹配行的計數。ui
-i:不區分大 小寫(只適用於單字符)。
-h:查詢多文件時不顯示文件名。
-e: 即egrep,配合擴展正則表達式使用和grep一樣的用法
-l:查詢多文件時只輸出包含匹配字符的文件名。
-n:顯示匹配行及 行號。
-s:不顯示不存在或無匹配文本的錯誤信息。
-v:反向選取,顯示不包含匹配文本的全部行
-o:僅顯示匹配的字串,而非字串所在的行
-A +#:顯示匹配行後#行
-B +#:顯示匹配行前#行
-C +#:顯示匹配行先後各#行
egrep = grep -e 用法與grep相同,配合擴展正則表達式使用,打印出匹配到的字符串。咱們前面一直在說grep或egrep 配合正則表達式使用,那麼什麼是正則表達式呢?下面爲你介紹,linux入門很重要的知識,正則表達式
3、正則表示 RE[Regular Expression]
正則表示基礎概念
是一類字符所書寫的模式,使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。其中許多字符不表示其字面意義,而是表達控制或通配等功能,簡明的說,正則表達式就是使用一些字符組合成的規則,來配合搜索命令讓用戶方便快捷的完成目的。
正則表示分 基礎正則表達式 與 擴展正則表達式 兩種類型。
一)基本正則表達式:
基本正則表達式一般使用的元字符以下:
一、 字符匹配
. : 表示任意單個字符
[]: 匹配指定範圍內的任意單個字符
[0-9] 匹配0-9內的任意單個數字同[[:digit:]]
[a-z]匹配a-z內的任意單個字母同[[:lower:]]
[A-Z]與[a-z]相似 同[[:upper:]]
[[:space:]] 匹配空格
[[:digit:]]匹配任意單個數字
[[:lower:]]匹配任意單個小寫字母
[[:upper:]]匹配任意單個大寫字母
[[:punct:]]匹配任意單個字符
[[:alpha:]]匹配任意單個字母
[[:alnum:]]匹配任意單個字母或數字
二、 次數匹配元字符,用於指定其前面的字符出現的次數
* : 表示任意長度,他前面的字符能夠出現任意次
\? : 表示0次或1次,它前面的字符無關緊要
例如:x\?y 有如下可能:
y 或者 xy
\{m\}: m次,它前的字符要出現m次
例如:x\{2\}y
可能爲: xy, xxy, y, xxxxy, xyy
\{m,n\}: 至少m次,至多n次
例如:x\{2,5\}y
可能爲: xy, y, xxy
\{m,\}:至少m次
\{0,n\}: 至多n次
.*:任意長度的任意字符
例如:顯示/boot/grub/grub.conf中以致少一個空白字符開頭的行;
[root@localhost ~]# grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
三、 位置錨定元字符,用於指定匹配字符所在行的具體位置
^: 行首錨定;
後跟的字符出如今行首
例如:搜索/etc/passwd 文件內以a開頭的行
[root@localhost ~]# grep --color=auto "^a" /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
apache:x:48:48:Apache:/var/www:/sbin/nologin
$: 行尾錨定:
後跟的字符出如今行尾
例如: 搜索/etc/passwd 文件內以bash結尾的行(因爲內容太多,我只列出幾行作示例)
[root@localhost ~]#grep "\bbash\b$" /etc/passwd
x1:x:3320:3320::/home/x1:/bin/bash
x2:x:3321:3321::/home/x2:/bin/bash
mmm1:x:3322:3322::/home/mmm1:/bin/bash
mmm2:x:3323:3323::/home/mmm2:/bin/bash
不包含特殊字符的連續字符組成的串叫單詞:
\<或\b: 詞首,出現於單詞左側,
>或\b: 詞尾,出現於單詞右側
^$: 表示空白行
四、分組和引用
分組:
\(\):把小括號內的內容當作單個字符來使用
引用:
\#: 引用第n個括號所匹配到的內容,而非模式自己。
例如: \(xyz\).*\1 = xyz.*xyz
二) 擴展正則表達式
擴展正則表達式主要是指 egrep fgrep 及幾個相關的特殊元字符
特殊元字符
+ 表示它前面的字符至少出現一次。
? 表示0個或1一個字符,與基本正則表達式裏的\?不一樣,請注意
| 用或的方式選擇|兩邊的字符。
() 用戶組字符串,就是把元字符內的看作是一個組一個總體。
4、舉2個grep + 正則表達式的結合使用示例:
(1)顯示當前系統上root、fedora或user1用戶的信息;
[root@localhost ~]#egrep "^(root|fedora|user1):" /etc/passwd
root:x:0:0:root:/root:/bin/bash
本例題,用到行首錨定^和擴展正則表達式中的"|",因此要用egrep,因爲個人系統上每添加fedora和user1用戶,故只顯示root的信息。
(2)使用echo命令輸出一個路徑,然後使用grep取出其基名
[root@localhost ~]#echo "/etc/passwd/" | grep -o -E "[[:alnum:]]+/?$"
passwd/
這個例題中,用到了grep ,管道,以及擴展正則表達式,能夠說是之後最經常使用到的模式,來處理教複雜點的問題,同時也用到了正則表達式的各類元字符。