一、grep
国际音标[grep]
grep是shell脚本中的文本搜索工具,根据用户指定的文本模式对目标文件进行逐行搜索,显示能被模式所匹配到的行。
格式:
grep [options] 'PATTERN' file,...
常用选项:
-v:反向匹配,显示不能被模式所匹配到的行。
-o:仅显示被模式匹配到的字串,而非整行。
-i:不区分大小写,ignore-case
-E:支持扩展正则表达式,Expand
-A:显示匹配行及下一行,after
-B:显示匹配行及上一行,befoe
-C:显示匹配行及上下行
grep基础用法很简单,直接命令+'PATTERN'+文件就好了
例:找出/etc/passwd文件中所有与root有关的行。
1
2
3
|
[root@nmshuishui ~] # grep "root" /etc/passwd
root:x:0:0:root: /root : /bin/bash
operator:x:11:0:operator: /root : /sbin/nologin
|
要想实现grep的高级用法,须配合正则表达式及管道。那就先讲讲基本正则表达式。
二、基本正则表达式
正则表达式就是一类字符所书写出的模式(pattern),来处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊称号的辅助,可以让用户轻易达到查找、删除、替换某特定字符串的处理程序。
元字符:不表示字符本身的意义,用于额外功能性的描述。
1)字符匹配:
.:匹配任意单个字符
2)次数匹配
* :匹配任意次 如:x*y: xxy xy y
.*:匹配任意长度的任意字符,0次或多次。
\?:匹配0次或1次 如:x\?y: xy y xxy
xxy是匹配了x 2次,这也能行?当然,因为,grep有贪婪模式,尽可能长的去匹配字符。
\{m\}:匹配m次 这里的\代表转义字符,扩展正则表达式中不用
\{m,n\}:匹配最少m次,最多n次
\{m,\}:匹配至少m次
\{0,n\}:匹配至多n次
3)位置锚定: 用于指定字符出现的位置
^:托字符,锚定行首 ^char
$:锚定行尾 char$
^$:空白行 既是行首,又是行尾,当然就是空白行了
\<:锚定词首 \<char \bchar 这里的\依然是转义
\>:锚定词尾 char\> char\b
\<hello\>:既锚定词首又锚定词尾,当然是锚定hello这个单词。
4)分组
\(\) \给括号转义
5)引用
\1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容 \(a.b\)xy\1 --> a6bxya6b
\2:前向引用,引用前面的第2个左括号以及与之对应的右括号中的模式所匹配到的内容
三、 小试牛刀:
1)显示/etc/passwd中以r开头的行(锚定行首)
1
2
3
4
5
|
[root@nmshuishui ~] # grep "^r" /etc/passwd
root:x:0:0:root: /root : /bin/bash
rpc:x:32:32:Rpcbind Daemon: /var/cache/rpcbind : /sbin/nologin
rtkit:x:499:497:RealtimeKit: /proc : /sbin/nologin
rpcuser:x:29:29:RPC Service User: /var/lib/nfs : /sbin/nologin
|
2)显示/etc/passwd中以大小写S开头的行
1
2
3
4
5
6
|
[root@nmshuishui ~] # grep "^[Ss]" /etc/passwd
sync :x:5:0: sync : /sbin : /bin/sync
shutdown :x:6:0: shutdown : /sbin : /sbin/shutdown
saslauth:x:498:76: "Saslauthd user" : /var/empty/saslauth : /sbin/nologin
sshd:x:74:74:Privilege-separated SSH: /var/empty/sshd : /sbin/nologin
shuishui:x:501:501:: /home/shuishui : /bin/bash
|
3)取出默认shell为bash的且其ID为最大的用户
1
2
|
[root@nmshuishui ~] # grep "bash$" /etc/passwd |cut -d: -f1,3 -n|tail -1
user1:508 |
4)显示/etc/passwd中的一位数或两位数(锚定词首、记尾、分组、转义、次数匹配)
5)找出当前系统上用户名和默认shell相同的用户(行首、行尾锚定)
6)grep配合其它命令的用法,找出本机的IP地址,只显示IP段(管道、cut)
1
2
|
[root@nmshuishui ~] # ifconfig eth0 | grep "inet addr:" | cut -d: -f2 | cut -d' ' -f1
192.168.1.102 |
四、egrep 扩展正则表达式
上面提到过了,在扩展正则表达式中不需要转义符\
元字符:
1)字符匹配:
.:任意单个字符
[]:指定范围内的任意单个字符
[^]:指定范围外的任意单个字符
2)次数匹配:
*:匹配其前面的字符任意次
?:匹配其前面的字符0次或1次
+:匹配其前面的字符1次或多次
{m}:匹配其前面的字符m次
{m,n}:至少m次,至多n次
{m,}:至少m次
{0,n}:至多n次
3)锚定:
^:锚定行首
$:锚定行尾
\<:锚定词首 \b
\>:锚定词尾 \b
4)分组:
():
| :或者 基本正则表达式中没有|
5)引用:
\1:前向引用,引用前面的第1个左括号以及与之对应的右括号中的模式所匹配到的内容
\2:前向引用,引用前面的第2个左括号以及与之对应的右括号中的模式所匹配到的内容
五、 扩展正则表达式练习
1)找出ifconfig中1-255之间的整数。