grep:global search regular expression and print out the line.全面搜索正则表达式并把行打印出来
是一种强大的文本搜索工具,能够使用正则表达式搜索文本,并把匹配的行打印出来。
linux系统能够使用GNU版本的grep,功能强大。并且可以通过-G/-E/-F命令行选项调用egrep和fgrep。
grep常用用法:
#grep 参数选项 搜索字符串 filename
常用参数:
-a 将bianary文件以text文件方式搜索数据
-c 计算找到‘搜索字符串’的次数
-i 忽略大小写
-n 顺便输出行号
-v 反向选择。即显示出没有‘搜索字符串’内容的行
--color=auto 将找到的关键词部分加上颜色显示
实例:
grep root /etc/passwd
cat /etc/passwd |grep root 都是搜索包含root的行
grep -n root /etc/passwd 搜索包含root的行,并且显示对应行号
grep -v root /etc/passwd 将不包含root的行显示,反向选择
grep -v root /etc/passwd |grep -v transfor 将同时不包含root和transfor的行显示
dmesg |grep -n 'em1' 搜索系统开机信息中包含em1字段的行
dmest |grep -n -A3 -B2 'em1' 在系统开机信息中搜索包含em1字段的行,并且显示前2行和后3行
根据文件内容递归查找目录:
grep 'youandme' * 在当前目录搜索包含‘youandme’行的文件
grep -r 'youandme' * 在当前目录以及其子目录下搜索包含‘youandme’行的文件
grep -l -r 'youandme' * 在当前目录以及其子目录下搜索包含‘youandme’行的文件,但不显示匹配的行,只显示匹配的文件。
这几个命令很有用,查找文件的利器
grep与正则表达式
字符类:
字符类搜索:如果我们想搜索test或tast两个单字时,发现共同的‘t?st’,可以这样搜索:
grep -n 't[ae]st' test.txt
其实[]里面有多少个字节,都只代表其中某一个字节。
字符类反向搜索[^]:如果想搜索包含oo的行,但不想oo前面有g
grep -n '[^g]oo' test.txt
字符类连续字符搜索:如果oo前面不想/想要小写英文字母,或者大写英文,或者数字,或者都有
grep -n '[^a-z]oo' test.txt
grep -n '[A-Z]oo' test.txt
grep -n '[^0-9]oo' test.txt
grep -n '[a-zA-Z0-9]' test.txt
行首与行尾字符搜索:^$
行首字符:如果想搜索the只在行首出现的行,则需要使用定位字节。
grep -n '^the' test.txt
grep -n '^[a-z]' test.txt 列出行首是小写字母开头的行
grep -n '^[^a-z]' test.txt 列出行首不是小写字母的行
'^'符号,在[]之内和之外的作用是不相同的,在[]之内,代表反向选择;在[]之外,代表定位在行首。
行尾字符:如果想搜索行尾结束为(.)的行
grep -n '\.$' test.txt
PS:因为小数点有其他特殊意义,所以必须用转义字符(\)接触特殊意义。
grep -n '^$' test.txt 找出空白行
任意一个字节(.)和重复字节(*)
(.) 表示一定有一个任意字节的意思
(*) 表示重复前一个字符,0-无穷多次,
如果我们找出 g??d 字符串,即共有4个字节,起头是g,结尾是d
grep -n 'g..d' test.txt 即g和d之间一定存在两个字节
如果搜索出含有oo,ooo,oooo...等数据时,即至少含有两个oo至无数个重复o的行
grep -n 'ooo*' test.txt
PS:(o*) 表示拥有空或1个o以上的字节,包含0个。所以需要搜索至少需要2个o以上字符串时,就需要(ooo*)表示。
如果搜索开头是g和结尾是g,但两者之间仅能存在至少一个o,即gog,goog,gooog,goooog...
grep -n 'goo*g' test.txt
如果搜索开头是g,结尾是g,中间字符可有可无。
grep -n 'g.*g' test.txt
PS:(.*)的RE表示任意字符是很常见的
如果想搜索包含任意数字的行
grep -n '[0-9][0-9]*' test.txt
限定连续RE(正则表达式regular express)字符范围{}
可以利用(.)和(*)组合,来表示0-无限多个重复字节,那如果限制一个范围区间内的重复字节数
如果想搜索2个到5个连续o,就要使用{},但因为{}在shell中具有特殊意义,所以需要 \ 去意符,使其失去特殊意义。
grep -n 'go\{2,5\}' test.txt
如果需要搜索2个以上连续o,goog,gooog,goo..g
grep -n go\{2,\} test.txt
grep扩展egrep使用
打印所有包含NW或EA的行。如果不是使用egrep,而是grep,将不会有结果查出。
# egrep 'NW|EA' testfile northwest NW Charles Main 3.0 .98 3 eastern EA TB Savage 4.4 .84 5
搜索所有包含一个或多个3的行。 # egrep '3+' testfile # grep -E '3+' testfile # grep '3\+' testfile #这3条命令将会 northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23 northeast NE AM Main Jr. 5.1 .94 3 13 central CT Ann Stephens 5.7 .94 5 13