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