grep最重要的功能就是进行字符串数据的比较,然后将符合需要的字符串打印出来,下面的使用方法大家可以到自己的美国vps上用ssh命令试验,这样记得更牢固。
grep在查找时,是以“行”为单位来进行数据选取的。
grep除了可以进行文件的数据搜索外,也经常应用在输入/输出的数据处理中。
语法:grep [ -acinv ] ‘字符串’ filename
-a,在二进制文件中,以文本文件的方式搜索数据
-c,计算找到“字符串”的次数
-i,忽略大小写
-n,输出行号
-v,反向选择,即显示没有“字符串”的那一行
搜索特定的字符串
grep ‘root’ /var/log/secure
显示/var/log/secure文件中有root的行
使用-n参数显示行号
grep -n ‘root’ /var/log/secure
grep -v ‘root’ /var/log/secure
显示/var/log/secure文件中没有root的行
使用[ ]进行搜索
如果要搜索boot或root时,由于这两个单词有共同的oot部分,可以使用如下的搜索方法:
grep -n ‘[r]oot’ /var/log/secure
在[ ]中,不论有多少个字符,都只代表一个字符。
[ ]中仅代表一个待搜索的字符。例如a [ bcd ] e表示可搜索的字符串可以是abc、ace和ade。
例如,我们可以使用如下语句来搜索含有oo字符的行:
grep -n ‘oo’ /var/log/secure
如果要排除oo前面有字母r的话,可以使用集合字符中的反向选择[^]来实现。
grep -n ‘[^]‘ /var/log/secure
此时,将没有任何输出结果。
假设oo前面不想出现小写字母,可以写为[^abcd...z],还可以简化为[^a-z]。
在一组集合字符中,如果该字符组是连续的,例如大小写英文或数字等,可以使用[a-z]、[A-Z]、[0-9]的方式书写,如果字符串是数字与英文,可以写为[a-zA-Z0-9]。其中,减号(-)代表两个字符之间的所有连续字符。
行首与行尾字符^和$
如果搜索root,并列出只在行首出现root的行,需要使用定位符:
grep -n ‘^root’ /var/log/secure
如果不想让开头是英文字母,可以如下操作:
grep -n ‘^[^a-zA-Z]‘ /var/log/secure
说明:对于^符号,在[ ]内表示反向选择,在[ ]外表示定位在行首。
类似的,要找出行尾以.结束的行,命令如下:
grep -n ‘\.$’ /var/log/secure
由于小数点(.)具有其他的含义,在这里需要使用转义符(\)来解除其特殊意义。
如果要找出空白行,执行如下命令:
grep -n ‘^$’ /var/log/secure
因为只有行首(^)和行尾($),这时候可以找出空白行。
如果要把空白行和以#开始的注释行略掉,执行如下命令:
grep -v ‘^$’ /var/log/secure | grep -v ‘^#’
使用任意字符(.)和重复字符(*)
在正则表达式中,点(.)表示“任意一个”字符。
grep -n ‘r..t’ /var/log/secure
将会显示包括root、r:tt等。
在正则表达式中, *表示重复前面0个或多个字符,因此(o*)表示“空字符或一个o以上的字符,grep -n ‘o*’ /var/log/secure将会把所有的内容显示在屏幕上。
如果要查找至少包括一个o的字符串,则应表示为grep -n ‘oo*’ /var/log/secure;如果至少要包括oo,则应表示为grep -n ‘ooo*’ /var/log/secure。
如果希望字符串的开头为r,结尾为t,r与t之间至少有一个o,且不能有其他字符,应如何表示?
grep -n ‘roo*t’ /var/log/secure
如果希望字符串的开头为r,结尾为t,r与t之间的字符可有可无,可否如下表示:
grep -n ‘r*t’ /var/log/secure
r*t中的星号将表示空字符或一个以上的r,将会显示包括rt、rrt、rrrt、rot、root等字符串的行。以上要求应如下表示:
grep -n ‘r.*t’ /var/log/secure
使用{ }限定连续重复字符范围
假如要找到两个o的字符串,可以这样操作:
grep -n ‘o\{2\}’ /var/log/secure
如果要找到r后面接2-4个o,后面再接一个t的字符串,可以这样操作:
grep -n ‘ro\{2,4\}t’ /var/log/secure
再试下r后面接3-5个o
如果要找到两个及两个以上o的字符串,可以这样操作:
grep -n ‘ro\{2\}t’ /var/log/secure
近期评论