shell学习系列(六).grep
时间:2007-08-05 来源:scutan
1.grep
grep的一般格式为:
grep [选项] 基本正则表达式 [文件]
这里基本正则表达式可为字符串
1.1 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来,例如"mystring".这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,例 如"jet plane".如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回"文件不存在"的错误信息.
在调用变量时,也应该使用双引号,诸如:grep "$MYVAR" 文件名,如果不这样,将没有返回结果.
在调用模式匹配时,应该使用单引号.
1.2 grep选项
常用的grep选项有:
-c 只输出匹配行的行数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示不存在或无匹配文件的错误信息
-v 显示不包含匹配文件的所有行
1.3 查询多个文件
如果要在当前目录下所有.doc文件中查找字符串"sort",方法如下:
grep "sort" *.doc
或在所有文件中查询单词"sort it"
grep "sort it" *
1.4 行匹配
grep -c "48" data.f
grep返回4,表示是有4行包含字符串"48"
1.5 行数
显示满足匹配模式的所有行行数:
grep -n "48" data.f
行数输出在第一列,后跟包含48的每一匹配行.
1.6 显示非匹配行
显示所有不包含48的各行:
grep -v "48" data.f
1.7 精确匹配
在抽取字符串"48"时,返回结果也可能会返回包含"484", "483"等含有"48"的其它字符串,实际上应精确抽取只包含48"的各行,可以采用如下方式来只提取含有48的项:
grep "48\>" data.f
或者是
grep "\<48\>" data.f
grep -w "48" data.f
1.8 大小写敏感
缺省情况下,grep是大小写敏感的,如果要查询大小写不敏感的字符串,必须使用-i选项.
2.grep和正则表达式
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选项,使用正则表达式最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的 特殊方式相混淆.
2.1 模式范围
假定要抽取代码为484或483的城市位置.
grep '48[34]' data.f
2.2 不匹配行首
如果要抽出记录,使其行首不是4或8,可以在方括号中使用^记号,表明查询在行首开始.
grep "^[^48]" data.f
如果要使行首不是48,则:
grep -v "^48" data.f
2.3 设置大小写
使用-i开关可以屏蔽月份Sept的大小写敏感,也可以用另外一种方式.这里使用[]模式抽取各行包含Sept 和 sept的所有信息.
grep "[Ss]ept" data.f
2.4 匹配任意字符
如果抽取以L开头,以D结尾的所有代码,可使用下述方法.因为已知代码长度为5个字符:
grp "k...d" data.f
2.5 日期查询
一个常用的查询模式是日期查询,先查询所有以5开始以1996或1998结尾的所有记录.使用模式5..199[6,8].这意味着第一个字符为5,后跟两个点,
grep "5..199[6,8]" data.f
2.6 范围组合
必须学会使用[]抽取信息,假定要取得城市代码,第一个字符为任意字符,第二个字符在0到5之间,第三个字符在0到6之间,使用下列模式即可实现:
grep "[0-9][0-5][0-6]" data.f
2.7 模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
grep '4\{2,\}' data.f
同样,抽取记录使之包含数字999,方法如下:
grep '9\{3,\}' data.f
2.8 使用grep匹配"与"或者"或"模式
grep命令加-E参数,这一扩展允许使用扩展模式匹配,例如,要抽取城市代码为219或216,方法如下:
grep -E '219|216' data.f
2.9 空行
结合使用^和$可查询空行,使用-n参数显示实际行数.
grep '^$' myfile
2.10匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ?,必须在特定字符前加\,假设要查询包含"."的所有行,脚本如下:
grep '\.' myfile
或者是一个双引号
grep '\"' myfile
以同样的方式,如果要查询文件名conftroll.conf,脚本如下:
grep 'conftroll\.conf' myfile
2.11查询格式化文件名
使用正则表达式可匹配任意文件名,系统中对文本文件有其标准的命名格式,一般最后六个小字字符,后跟句点.接着是两个大写字符.例如,要在一个包含各类文件名的文件 filename.deposit中定位这类文件名,方法如下:
grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename.deposit
2.12查询IP地址
使用[0-9]\{3\}\.[0-9]\{3\}\. 含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点.
3.类名
grep允许使用国际字符模式匹配或匹配模式的类名形式.
类 等价的正则表达式
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或TAB键
[[:alpha:]] [a-zA-Z]
要抽取产品代码,该代码以5开头,后跟至少两个大写字母,使用的脚本如下:
grep '5[[:upper:]][[:upper:]]' data.f
如果要抽取以P或D结尾的所有产品代码,方法如下:
grep '[[:upper:]][[:upper:]][P,D]' data.f
4.系统grep命令
4.1 目录
如果要查询目录列表中的目录,方法如下:
ls -l | grep '^d'
如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l | grep '^[^d]'
要查询其它用户和其它用户组成员有可执行权限的目录集合,方法如下:
ls -l | grep '^d.....x..x'
4.2 passwd文件
grep "root" /etc/passwd
上述脚本查询/etc/passwd文件是否包含root字符串.
4.3 使用ps命令
使用带有ps x命令的grep可查询系统上运行的进程,ps x命令意为显示系统上运行的所有进程列表.输出也应包含此grep命令,因为grep命令创建了相应进程,ps x将找到它,在 grep命令中,使用-v选项可丢弃ps命令中的grep进程.
ps ax | grep "named" | grep -v "grep"
4.4 对一个字符串使用grep
grep不只应用于文件,也可应用于字符串,为此使用echo字符串命令,然后对grep命令使用管道输入.
STR="mary joe peter pauline"
echo $STR| grep "mary"
grep的一般格式为:
grep [选项] 基本正则表达式 [文件]
这里基本正则表达式可为字符串
1.1 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来,例如"mystring".这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,例 如"jet plane".如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回"文件不存在"的错误信息.
在调用变量时,也应该使用双引号,诸如:grep "$MYVAR" 文件名,如果不这样,将没有返回结果.
在调用模式匹配时,应该使用单引号.
1.2 grep选项
常用的grep选项有:
-c 只输出匹配行的行数
-i 不区分大小写(只适用于单字符)
-h 查询多文件时不显示文件名
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示不存在或无匹配文件的错误信息
-v 显示不包含匹配文件的所有行
1.3 查询多个文件
如果要在当前目录下所有.doc文件中查找字符串"sort",方法如下:
grep "sort" *.doc
或在所有文件中查询单词"sort it"
grep "sort it" *
1.4 行匹配
grep -c "48" data.f
grep返回4,表示是有4行包含字符串"48"
1.5 行数
显示满足匹配模式的所有行行数:
grep -n "48" data.f
行数输出在第一列,后跟包含48的每一匹配行.
1.6 显示非匹配行
显示所有不包含48的各行:
grep -v "48" data.f
1.7 精确匹配
在抽取字符串"48"时,返回结果也可能会返回包含"484", "483"等含有"48"的其它字符串,实际上应精确抽取只包含48"的各行,可以采用如下方式来只提取含有48的项:
grep "48\>" data.f
或者是
grep "\<48\>" data.f
grep -w "48" data.f
1.8 大小写敏感
缺省情况下,grep是大小写敏感的,如果要查询大小写不敏感的字符串,必须使用-i选项.
2.grep和正则表达式
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选项,使用正则表达式最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的 特殊方式相混淆.
2.1 模式范围
假定要抽取代码为484或483的城市位置.
grep '48[34]' data.f
2.2 不匹配行首
如果要抽出记录,使其行首不是4或8,可以在方括号中使用^记号,表明查询在行首开始.
grep "^[^48]" data.f
如果要使行首不是48,则:
grep -v "^48" data.f
2.3 设置大小写
使用-i开关可以屏蔽月份Sept的大小写敏感,也可以用另外一种方式.这里使用[]模式抽取各行包含Sept 和 sept的所有信息.
grep "[Ss]ept" data.f
2.4 匹配任意字符
如果抽取以L开头,以D结尾的所有代码,可使用下述方法.因为已知代码长度为5个字符:
grp "k...d" data.f
2.5 日期查询
一个常用的查询模式是日期查询,先查询所有以5开始以1996或1998结尾的所有记录.使用模式5..199[6,8].这意味着第一个字符为5,后跟两个点,
grep "5..199[6,8]" data.f
2.6 范围组合
必须学会使用[]抽取信息,假定要取得城市代码,第一个字符为任意字符,第二个字符在0到5之间,第三个字符在0到6之间,使用下列模式即可实现:
grep "[0-9][0-5][0-6]" data.f
2.7 模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
grep '4\{2,\}' data.f
同样,抽取记录使之包含数字999,方法如下:
grep '9\{3,\}' data.f
2.8 使用grep匹配"与"或者"或"模式
grep命令加-E参数,这一扩展允许使用扩展模式匹配,例如,要抽取城市代码为219或216,方法如下:
grep -E '219|216' data.f
2.9 空行
结合使用^和$可查询空行,使用-n参数显示实际行数.
grep '^$' myfile
2.10匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ?,必须在特定字符前加\,假设要查询包含"."的所有行,脚本如下:
grep '\.' myfile
或者是一个双引号
grep '\"' myfile
以同样的方式,如果要查询文件名conftroll.conf,脚本如下:
grep 'conftroll\.conf' myfile
2.11查询格式化文件名
使用正则表达式可匹配任意文件名,系统中对文本文件有其标准的命名格式,一般最后六个小字字符,后跟句点.接着是两个大写字符.例如,要在一个包含各类文件名的文件 filename.deposit中定位这类文件名,方法如下:
grep '^[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename.deposit
2.12查询IP地址
使用[0-9]\{3\}\.[0-9]\{3\}\. 含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点.
3.类名
grep允许使用国际字符模式匹配或匹配模式的类名形式.
类 等价的正则表达式
[[:upper:]] [A-Z]
[[:lower:]] [a-z]
[[:digit:]] [0-9]
[[:alnum:]] [0-9a-zA-Z]
[[:space:]] 空格或TAB键
[[:alpha:]] [a-zA-Z]
要抽取产品代码,该代码以5开头,后跟至少两个大写字母,使用的脚本如下:
grep '5[[:upper:]][[:upper:]]' data.f
如果要抽取以P或D结尾的所有产品代码,方法如下:
grep '[[:upper:]][[:upper:]][P,D]' data.f
4.系统grep命令
4.1 目录
如果要查询目录列表中的目录,方法如下:
ls -l | grep '^d'
如果在一个目录中查询不包含目录的所有文件,方法如下:
ls -l | grep '^[^d]'
要查询其它用户和其它用户组成员有可执行权限的目录集合,方法如下:
ls -l | grep '^d.....x..x'
4.2 passwd文件
grep "root" /etc/passwd
上述脚本查询/etc/passwd文件是否包含root字符串.
4.3 使用ps命令
使用带有ps x命令的grep可查询系统上运行的进程,ps x命令意为显示系统上运行的所有进程列表.输出也应包含此grep命令,因为grep命令创建了相应进程,ps x将找到它,在 grep命令中,使用-v选项可丢弃ps命令中的grep进程.
ps ax | grep "named" | grep -v "grep"
4.4 对一个字符串使用grep
grep不只应用于文件,也可应用于字符串,为此使用echo字符串命令,然后对grep命令使用管道输入.
STR="mary joe peter pauline"
echo $STR| grep "mary"
相关阅读 更多 +