grep(Globel Search Regular Expression and Printing out the line)全面搜索正则表达式并把行打印出来)是一个强大的文本搜索工具,使用正则表达式搜索文本的文本,并把结果打印出来。Unix家族包括grep、egrep和fgrep。egrep是扩张的正则表达式它支持更多的字符,fgrep是fast grep它不支持元字符搜索,但搜索速度更快。grep搜索结果不影响原文件。
grep命令
全面搜索正则表达式并把行打印出来
常用语法grep [OPTIONS] PATTERN [FILE…]
命令 选项 模式 文件
PATTERN 模式 是由正则表达式的元字符和普通字符所指定的过滤条件。
常用选项
-A NUM, –after-context=NUM#显示匹配行的后NUM行
-B NUM, –before-context=NUM#显示匹配行的前NUM行
-C NUM, -NUM, –context=NUM#显示匹配行的前后NUM行
-E, –extended-regexp#扩张的正则表达式-n,
–line-number#显示匹配的行号
-q, –quiet, –silent#静默模式,不做任何输出
-o, –only-matching #只显示匹配到的行
–color[=WHEN], –colour[=WHEN]#匹配高亮显示,cent6.#默认没启用
-c, –count #统计匹配的行数-i,
–ignore-case #忽略大小写
-v, –invert-match#显示不能够被pattern到的行 (取反)
-w, –word-regexp#单词匹配而不是字符
在使用grep前先了解了解正则表达式。正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
正则表达式的元字符可以做
字符匹配 匹配次数 位置锚定 分组
正则表达式使用的是贪婪模式,能匹配多长就尽量匹配多长
grep不加引号直接过滤字符串;grep在进行模式匹配的时候必须加引号,单引和双引号都可以;grep在引用变量的时候必须加双引号
如果要匹配特殊字符的话要使用\转义来匹配特殊字符 如\$ \@等
字符匹配
. 匹配任意单个字符
[]匹配括号能指定的字符
[^]匹配括号外的指定字符
[alpha]:匹配所有字符
[:alnum:] 除了换行符外的所有字符
[:punct:] 所有标点符号
[:space:] 空格和tab
[:digit:] [0-9] 匹配所有数字
[:lowwer:][a-z] 匹配所有小写字符
[:upper:] [A-Z] 匹配所有的大写字符
匹配次数
* 匹配前面字符0次、1次或多次
.* 匹配任意长度任意字符
\? 匹配前面字符0次或1次
\+ 匹配前面字符至少一次或以上多次
\{m\} 匹配前面字符m次
\m,n\} 匹配前面字符最少m次,最多n次
\{,n\} 匹配前面字符做多n次\
{m,\} 匹配前面字符最少m次
位置锚定
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
^PATTERN$ 用于模式匹配整行
^$ 空行
^[[:space:]]*$ 空白行
\< 或\b:词首锚定,用于单词模式的左侧
\> 或\b:词尾锚定;用于单词模式的右侧\<PATTERN\>:匹配整个单词
分组\(PATTERN\) 将一个或多个字符捆绑在一起,当作一个整体进行处理。引用第一个小括号的分组\1,第二个是\2,以此类推。
示例
1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
grep -i '^s' /proc/meminfo grep '^[sS] /proc/meminfo
2、显示/etc/passwd文件中不以/bin/bash结尾的行
grep -v '/bin/bash$' /etc/passwd
3、显示用户rpc默认的shell程序
grep '\<rpc\>' /etc/passwd|cut -d: -f7
4、找出/etc/passwd中的两位或三位数
grep '\<[1-9][0-9]\{1,2\}\>' /etc/passwd
5、显示/etc/grub.conf文件中,至少以一个空白字符开头的且后面存非空白字符的行
grep '^[[:space:]]\+[^[:space:]]' /etc/grub.conf
6、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行
netstat -tan|grep '\<LISTEN[[:space:]]*'
7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
grep '^\(.*\)\>.*\1$' /etc/passwd
egrep是扩展的正则表达式
即grep -E
常用语法grep [OPTIONS] PATTERN [FILE…]
命令 选项 模式 文件
egrep常用选项和字符匹配基本和grep就不多做解释了
次数匹配:
*:匹配前面字符任意次
?: 0或1次
+:1次或多次
{m}:匹配m次
{m,n}:至少m,至多n次
位置锚定:
^ :行首锚定,用于行的最左侧
$ :行尾锚定,用于行的左右侧
\<, \b :词首锚定。
\>, \b :词尾锚定
分组:
(pattern) 将一个或多个字符捆绑在一起,当作一个整体进行处理。引用第一个小括号的分组\1,第二个是\2,以此类推。
后向引用:\1, \2, …
或者:
a|b :a或b
C|cat: C或cat
(C|c)at:Cat或cat
示例
1、显示当前系统root、mage或wang用户的UID和默认shell
egrep '^root\>|^mage\>|^wang\>' /etc/passwd|cut -d: -f3,7
2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
egrep '[[:alnum:]_]\(\)' /etc/rc.d/init.d/functions
3、使用egrep取出/etc/rc.d/init.d/functions中其基名
echo "/etc/rc.d/init.d/functions " |egrep -o '(.*/)+(.*)\1'
4、使用egrep取出上面路径的目录名
echo "/etc/rc.d/inittab/functions" |grep '[^/]\+/\?$'
5、统计以root身份登录的每个远程主机IP地址的登录次数
last |egrep –color=auto '^root\>.*(.*\.){3}[0-9]{3}\> '
|tr -s ' '|cut -d' ' -f3|sort |uniq -c
6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
egrep '\<[0-9]\>' :0-9
egrep '\<[1-9][0-9]\>' :10-99
egrep \<1[0-9]{2}\>:100-199
egrep \<2[0-4][0-9]\> :200-249
egrep \<25[0-5]\>:250-255
7、显示ifconfig命令结果中所有IPv4地址
egrep '((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-4]|[01]?[0-9][0-9]?)'
原创文章,作者:ladsdm,如若转载,请注明出处:http://www.178linux.com/33743