grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Grep命令中允许指定的串语句是一个规则表达式,这是一种允许使用某些特殊键盘字符的指定字符串的方法,这种方法中的特殊键盘字符可以用于代表其他字符也可以进一步定义模式匹配工作方式。---百度百科
grep命令常见的格式为:grep [-cinvqABC] 'word' filename
-c:表示打印符合要求的行数(并不是匹配的次数)。
-i:表示忽略大小写。
-n:表示输出符合要求的行及其行号
-v:表示打印不符合要求的行(反向)
-e: 指定多个匹配样式
-l :列出匹配文本位于哪一个文件中。The scanning will stop on the first match。
-An:打印符合要求的行以及后面n行
-Bn:打印符合要求的行以及前面n行
-Cn:打印符合要求的行以及前后各n行
--color=auto 符合要求的行列出颜色
同时可以在 ~/.bashrc 内加上这行:alias grep='grep --color=auto'再以 source ~/.bashrc来立即生效即可。 这样每次运行 grep 都会自动加上颜色显示。#echo 'alias grep='grep --color=auto' >> ~/.bashrc. 每当一个新的shell进程生成时,进了会执行~/.bashrc 中的命令
1.匹配带有某个关键字(或不带有)的行并输出行号。
[root@localhost ~]# grep -n 'root' /etc/passwd 或是 #cat /etc/passwd | grep -n 'root'
1:root:x:0:0:root:/root:/bin/bash
11:operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# grep -nv 'root' /etc/passwd
统计文件中匹配项的数量
#grep -c 'text' filename | wc -l
2.递归搜索文件
#grep 'text'. -R -n “ .” 代表当前目录 ,这介开发人员使用的最多的命令之一,它用于查找某些文本位于哪些源码文件中。
3.单个grep命令可以对多个文件进行搜索
#grep 'match_text' file1 ,file2,file3....
#grep-l 'match_text' file1 ,file2,file3.... 可以搜索出多个文件并匹配文本位于哪一个文件中。
4.用grep匹配多个样式
#grep -e 'pattern1' -e 'pattern'
注:与 l 相反的是L,它会返回一个不匹配的文件列表。
5.利用[] 匹配和查找一个指定范围内的字符
[root@localhost ~]# grep '[0-9]'/etc/inittab #.过滤所有包含数字的行,,若要求字符串是数字和英文可写成[0-9a-zaA-Z]
[root@localhost ~]# grep -v '[0-9]' /etc/inittab #.过滤所有不包含数字的行
[root@localhost ~]# grep -n 't[ae]st' filename #列出含有”tast"和"test"的字符串的行
6.删除所有以'word'开头(或结尾)的行和所有空行
[root@localhost ~]# grep -v '^#' /etc/crontab | grep -v '^$'
[root@localhost ~]# grep -n '\.$' filename #找出行尾以小数点(.)结束的那一行,因为小数点还有其他意义,所以要使用转义字符\来加以解除其特殊意义。
注:在正则表达式中,'^'代表行的开始,'$'代表行的结尾, '^$'就代表空白行。
7.反向选择[^list/字符],找出不要的字符串或范围
[root@localhost ~]#grep -n '[^a-zA-Z]' filename #列出非全部字母行
123
abc456
#edf
[root@localhost ~]#grep -n '^[a-zA-Z]' filename #列出以字母开始的行
[root@localhost ~]#grep -n '^[^a-zA-Z]' filename #列出不是以字母开始的行
注:注意^[]和[^]的区别
8.过滤出任意一个字符.和重复字符*
"."代表一定有一个任意字符
[root@localhost ~]#grep -n 'r..o' /etc/passwd
"r..o"表示把r和n之前的有两个任意字符的行过滤出来。
在正则表达式中*并不像通配符那样代表任意(0或多个)字符,代表重复匹配零个或多个先前字符(零个代表先前字符不存在)
[root@localhost ~]# grep 'ooo*' /etc/passwd
'ooo*'表示oo,ooo,oooo.....
'oo*代表为o,oo,ooo,oooo....
'o*'代表空字符或一个o以上的字符
[root@localhost ~]# grep 'r*t' /etc/passwd
'r*t' 并不表示以r开头以t结尾的字符串,因为r*代表空字符以及r,rr,rrr....再加上后面的t,'r*t'表示t,rt,rrt,rrrt...
而'.*"就代表零个或多个任意字符,可以表示表示以r开头以t结尾的字符串
[root@localhost ~]# grep 'r.*t' /etc/passwd
9.限定连续字符的范围{}
[root@localhost ~]# grep 'o\{2\}' /etc/passwd
x\{m\}
重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
思考一下以上四个图为什么o\{2\},o\{2,\},o\{2,3\}会出现roooooot,而‘ro\{2,3\}t' 不会出现。
10.在grep 搜索中指定或排除文件
#grep ''main()" . -r --include *.{c,cpp} 目录中递归搜索所有的.c和.cpp文件
#grep "main()" . -r --exclude "README" 在搜索中排除所有的README文件
11.grep 的静默输出
有时并不打算查看匹配的字符串,而只是想知道是否能够匹配成功,可通过-q静默选项实现。
在静默模式中,grep不会输出 任何内容,它仅根据命令执行成功与否返回退出状态,如果命令
运行成功则返回0.
编写一个脚本利用grep的静默模式来测试文本匹配是否存在于某个文件中。
#!/bin/bash
#filename:quiet_grep.sh
#function:测试文件是否包含特定的文本内容
if [ $# -ne 2 ];then
echo "Usage: $0 $1 $2"
exit 1
fi
grep -q $1 $2
if [ $? -eq 0 ]; then
echo "The text exist in the file"
else
echo "The text dose not exist in the file"
fi
#chmod a+x quiet_grep.sh
# ./quiet_grep.sh root /etc/passwd
The text exist in the file
http://wenku.baidu.com/view/0818eb1aff00bed5b9f31dc6.html?re=view
http://www.dabu.info/linux-install-ipython.html
http://blog.chinaunix.net/uid-26000296-id-3421802.html
http://blog.youkuaiyun.com/dysh1985/article/details/7571273