1:什么是正则表达式:
简单的说,正则表达式就是处理字符串的方法,它是以行为单位进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让用户轻易达到查找,删除,替换某特定字符串的处理程序。
2:一些参数:
grep [-A] [-B] [--color=auto] '收索字符串' filename
-A :后面可加数字,为after的意思,除了列出该行以外,后续的n行也被列出来。
-B :后面可加数字,为befer的意思,除了列出该行以外,前面的n行也被列出来。
--color=auto:可将正确的那个选取数据列出颜色
范例一:
dmesg | grep 'eth'
#dmesg 可以列出内核的信息,通过grep选取网卡相关信息。
范例二:
dmesg | grep -n --color-auto 'eth'
[root@Slave0 hadoop]# dmesg | grep -n --color=auto 'eth'
452:[ 11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
发现除了eth会有特殊的颜色,且加上行号显示。
452:[ 11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
发现除了eth会有特殊的颜色,且加上行号显示。
范例三:
dmesg | grep -n -A3 -B2 --color=auto 'eth'
450-[ 11.213478] 802.1Q VLAN Support v1.8 Ben Greear <greearb@candelatech.com>
451-[ 11.213482] All bugs added by David S. Miller <davem@redhat.com>
452:[ 11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
453-[ 11.334391] cnic: Broadcom NetXtreme II CNIC Driver cnic v2.5.20 (March 14, 2014)
454-[ 11.355742] bnx2fc: Broadcom NetXtreme II FCoE Driver bnx2fc v2.4.2 (Dec 11, 2013)
455-[ 11.371077] netlink: 12 bytes leftover after parsing attributes.
451-[ 11.213482] All bugs added by David S. Miller <davem@redhat.com>
452:[ 11.213498] 8021q: adding VLAN 0 to HW filter on deviceeth0
453-[ 11.334391] cnic: Broadcom NetXtreme II CNIC Driver cnic v2.5.20 (March 14, 2014)
454-[ 11.355742] bnx2fc: Broadcom NetXtreme II FCoE Driver bnx2fc v2.4.2 (Dec 11, 2013)
455-[ 11.371077] netlink: 12 bytes leftover after parsing attributes.
发现除了eth会有特殊的颜色,且加上行号显示。且452的前两行,452的后三行也显示出来了。
三:基础正则表达式练习:
例1:查找特定字符串
[root@Master ~]# grep -n 'ab' newusers
5:Annabell:Cho:90:1
8:Rebecca:Fabry:60:1
[root@Master ~]#
5:Annabell:Cho:90:1
8:Rebecca:Fabry:60:1
[root@Master ~]#
如果反向选择呢?也即是说该行没有‘ab’这个字符串才会显示在屏幕上
[root@Master ~]# grep -vn 'ab' newusers
1:Betsey:Werts:60:1
2:Henriette:Balla:30:1
3:Julieann:Hopps:30:2
4:Conrad:Menz:60:1
6:Allyn:Kenley:60:1
1:Betsey:Werts:60:1
2:Henriette:Balla:30:1
3:Julieann:Hopps:30:2
4:Conrad:Menz:60:1
6:Allyn:Kenley:60:1
例2:利用中括号[]来查找集合字符。
如果我想找testhe taste这两个单词,可以发现,他们共同有‘t?st’存在,这个时候,我们可以这样查找。
grep -n 't[ae]st' newusers
如果查找到有dd字符时,则使用:
grep -n 'dd' newusers
如果不想要dd前面有g,此时可以可用集合字符的反向选择[^]来完成。
grep -n '[^g]dd' newusers
例3:行首和行尾字符^$
如果想要字符串‘the’只在行首才列出,之格式化就要用到制表符了,做法如下:
grep -n '^the' filename
如果要列出字母开头
grep -n '^[a-z]' filename
如果不想要开头是字母的
grep -n '^[^a-zA-Z]' filename
注:那个^符号在字符集合符号(中括号[])之内与之外是不一样的,在【】代表“反向选择”,在【】之外则代表定外在行首的意义。
那么如果要找出行位结束为小数点(.)的那一行,该怎么处理呢?
grep -n '\.$' filename
特别注意,小数点具有其他意义,所以必须使用转义字符(\)加以解除他的特殊意义。
如果要找出空白行:
grep -n '^$' filename
例4:任意一个字符.与重复字符*
.(小数点):代表一定有一个任意字符的意思
grep -n 'g..d' filename
[root@Master ~]# grep -n a..a newusers
2:Henriette:Balla:30:1
21:Elsa:Casazza:60:3
2:Henriette:Balla:30:1
21:Elsa:Casazza:60:3
*(星号):代表重复前一个0到无穷多次的意思,为组合形态。
grep -n 'ooo*' filename
注,前两个o肯定要必须存在,第三个o则是可有可无的多个o
四:基础正则表达式字符:
RE字符 | 意义和范例 |
^word | 查找(word)在行首 |
word$ | 查找(word)在行尾 |
. | 代表一定有一个任意的字符 |
\ | 将特殊符号的特殊意义去除 |
* | 重复零个到无穷多个的前一个字符 |
[list] | 从字符集合的RE字符里面找出想要选取的字符 |
[n1-n2] | 从字符集合的RE字符里面找出想要选取的字符范围.如:grep -n '[0-9]' filename |
[^list] | 从字符集合的RE字符里面找出不要的字符串范围。 |
\{n,m\} | 连续n到m个前一个RE字符,若为\{n\}则是连续n个的前一个RE字符,若为\{n,\}则是连续 n个以上的前一个RE字符, 范例:在g与g之间有2到3个o存在的字符串即(goog)(gooog) grep -n 'go\{2,3\}g' filename |
五:扩展正则表达式:
grep默认仅支持基础正则表达式,如果使用扩展型正则表达式,可以使用grep -e 不过更建议直接使用egrep.
+ | 重复一个或一个以上的前一个RE字符 |
? | 零个或者一个前一个RE字符 |
| | 用或(or)的方式找出数个字符串, 例:查找gd或者good这两个字符串 egrep -n 'gd|good' filename |
() | 找出“组” 字符串 如,找出(glad)或(good)这两个字符串 egrep -n 'g (la|oo) d' filename |
()+ | 多个重复组判别 |