grep的简介
Linux中对于文本的操作常用的处理工具有三种,被称为文本处理的三剑客。grep主要用于匹配文件中的行文本搜索,通过grep可以方便地检索文件关键字,检索到需要的文本信息.grep常用的命令格式为:
grep [options] [“pattern”] [file]
常用选项
- -b: 显示匹配到的位置(byte位置);
- -c: 只显示匹配的结果个数;
- -f: 使用文件作为需要输入的匹配字符串;
- -i : 忽略大小写(ignore case);
- -n: 显示匹配行号;
- -o: 只显示匹配到的结果,不显示整行;
- -q: 静音模式,不输出任何内容;
- -r: 递归检索,会在给定的路径中递归查找目标字符串;
- -x: 按照完整行匹配给定字符串,会默认给出的字符串是一个完整的输入行并按行匹配文件,检索出与给出行一致的行;
- -v:逆反模式,输出没有匹配的模式;
- -E:使用延展的正则匹配模式;
- -A n:显示匹配结果之后的n行, after;
- -B n: 显示匹配结果之前的n行,before;
- -C n: 显示匹配结果前后的n行, context;
常用表达式(BRE)
字符匹配
- . 匹配任意单个字符;
- [] 给定范围内的单个字符;
- [:alpha:] 代表英文字符,即[a-zA-Z];
- [:upper:] 代表英文大写字母,即[A-Z];
- [:lower:] 代表小写英文字母,a-z;
- [:blank:] 代表空白字符(空格和制表符);
- [:space:] 代表水平和垂直的空白符;
- [:digit:] 代表十进制数字;
- [:xdigit:] 代表十六禁止数字;
- [:print:] 代表可打印的字符;
- [:graph:] 代表可打印的非空白字符;
- [:punct:] 代表标点符号
匹配次数
- * 代表任意长度,包括0次;
- . 代表任意字符;
- \? 代表出现一次或者0次;
- \+ 代表至少出现一次;
- \{n} 代表匹配前边的字符单元n次;
- \{m,n\} 代表匹配前边的字符单元至少m次,至多n次;
- \{m,\} 代表匹配前边的字符单元至少m次;
- \{, n\} 代表匹配前边的字符单元至多n次;
位置锚点
- ^ 用于匹配行首位置;
- $ 用于匹配行尾位置;
- ^PATTERN$ 用于匹配整行, 特殊地,^$匹配空白行;
- < 或者 \b 用于匹配单词的开始位置;
- > 或者 \b 用于匹配单词结尾;
- <PATTERN> **匹配完整单词
分组
使用()讲一个或者多个字符捆绑在一起作为一个整体进行处理,例如: (root),就可以表示一个字符单元,此时如果使用次数修饰该字符单元,就相当于对整个单元添加次数模式。同时,分组括号中的模式匹配到的内容会被正则表达式引擎机记录在内部变量中使用数字按照被捕获的顺序进行命名,第一个捕获的字符单元可以使用\1表示,第二次捕获的变量使用\2表示,依次类推.
例如:
模式"\([[:lower:]]\+)\1" 可以匹配到 wangerdongdong 中的dongdong
常用操作
grep主要用于在指定文件中检索关键字,可以在一个或者多个文件中进行检索.为了方便说明创建文件a.h,b.h
a.h
@interface Dog : NSObject
@property (copy, nonatomic) NSString *name;
-(void)wangwang;
-(NSString *)getDescription;
b.h
@interface Cat : NSObject
@property (copy, nonatomic) NSString *name;
-(void)miaomiao;
-(NSString *)getDescription;
在单个文件中检索
- 检索固定字符串
例如在a.txt文件中检索getDescription方法
当需要检索的方法书写已经确定时
grep "\-(NSString \*)getDescription;" a.txt
当需要检索的方法仅返回值前后可能包括空格时
grep "\-[[:blank:]]*(NSString \*)[[:blank:]]*getDescription;" a.txt
当只知道方法名不知道返回值类型时
grep "\-([[:alpha:]]\+\( \\*\)\?)getDescription" a.txt
- 当只是需要确定方法是否存在,不需要查看方法时:
grep "\-[[:blank:]]\*([[:blank:]]\*[[:alpha:]]\+[[:blank:]]\*\*\?)[[:blank:]]\*getDescription" a.txt
查看文件中是否存在指定的行(文件中的整行内容必须与给定的行一致才算是匹配)
grep -x "\-(void)sendMessage;" a.h
同时在文件a.txt和b.txt中的行
grep -f a.h b.h
在文件a.txt不在b.txt中的行
grep -v -f b.h a.h
使用正则表达式匹配想要的模式,比如是否存在名称对称的字符串
grep "\(\w\{2,\}\)\1" a.h
在多个文件中检索
- 需要在当前路径下的所有文件中检索声明文件,使用 “*”
grep "@interface[[:blank:]]\+[[:upper:]]\+[[:lower:]]\+[[:blank:]]\*:[[:blank:]]\*[[:upper:]]\+[[:lower:]]\+" *
- 需要在当前路径下的所有txt文件中检索声明文件
grep "@interface[[:blank:]]\+[[:upper:]]\+[[:lower:]]\+[[:blank:]]\*:[[:blank:]]\*[[:upper:]]\\+[[:lower:]]\+" *.h
统计文件中是否存在空白行
grep -c "^[[:blank:]]*$" b.h
在iOS开发中的应用
- 检查实现中是否使用某些类或者方法
在iOS开发中经常需要使用到的一个操作就是检验应用中是否包含了一些废弃的api或者私有api,
- 例如在iOS9.0之前可以使用系统内置的设定路径(类似于这样的prefs:root=General&path=ACCESSIBILITY)跳转到指定的功能界面,但是在新的提交中如果包含了这样的跳转就会被拒绝;
- 再比如在iOS新的审核细则中不再允许使用UIWebview组件;
由于应用中使用到的很多的实现可能没有办法看到源代码,这时候就可以可以使用grep进行检索;
grep -r "prefs:root=" . grep -r "UIWebview" .
然后再针对对应的文件查找对应的实现,去掉不符合要求的Api.
- 有时候需要批量对实现中的类名,属性名或者方法做修改,这时候就可以使用grep命令来查找到需要修改的属性名称.
例如想要修改某一个类中的属性的名称,就可以可以先通过
grep "@property.*" {filename}
获取属性声明,然后剥离出属性名,在使用sed命令进行修改.
- 查找文件路径
有时候自己保存的文本文件突然忘记了保存在那里,就可以通过grep进行查找.例如,使用.txt文件保存了淘宝的密码,但是却找不到放在那个路径下
grep -r "淘宝密码" .