Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248213
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 80
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-16 09:08
文章分类

全部博文(94)

文章存档

2016年(3)

2015年(86)

2014年(5)

分类: LINUX

2015-05-19 17:26:56

原文地址:shell命令之grep 作者:Deem_passion

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"
阅读(1427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~