- 论坛徽章:
- 0
|
本帖最后由 j3kljs02398j 于 2012-10-11 13:13 编辑
建议对文中命令进行亲自尝试与检验。
1. 多个关键字查找
1.1 关键字间or操作(多个-e选项; 元字符\|; -f file)
- # 多个-e选项
- grep -l -e 'string\.h' -e 'stdlib\.h' /usr/include/*.h
- # 使用\|
- grep 'strint\.h\|stdlib\.h' /usr/include/*.h
- grep -E 'string\.h|stdlig\.h' /usr/include/*.h#使用-E 看着舒服
- # 使用-f 指定文件
- grep -l -f multi_pattern.txt /usr/include/*.h
-
复制代码
ps:
-e 选项可以避免 关键字是-开头的导致选项解读失败。但是书写不方便。
启用-E后,可以用|来进行or操作, 这个是非常方便的。
1.2 关键字间and操作(通过管道|; 通过正则)
- # 通过管道
- echo hello world | grep '\<hello\>' | grep '\<world\>'#同时包含'hello','world'的行
- #通过正则对n个关键字全排序
- grep -E 'pattern1.*pattern2|pattern2.*pattern1'#2个关键字还好,要是n!个关键字!
复制代码
ps:
当进行and匹配的时候, 还是喜欢用管道的方式。
2. 匹配单词(-w gnu选项; \<\>)
- grep -w 'main' /usr/include/*.h#这个-w很方便
- grep '\<main\>' /usr/include/*.h
复制代码
ps:当不考虑可移植性的时候, -w代替/<...>/方便多了。
3.善用-E和-P(启用 extended expression和perl-regrexp,正则写起来更加灵活,省去很多的\,正则功能更强大)
- man gcc | grep -E '(\<the\>|\<that\>|\<and\>|\<or\>) \1'#查看gcc帮助文件里两个the/that/and/or连在一起的行
- man gcc | grep -E -w '(the|that|and|or) \1'
- man gcc | grep -E -w '([a-zA-Z]+) \1'#查看gcc帮助文件里含两个连续单词的行
复制代码 ps:
grep的强大依靠于正则使用。-P无所不能!
4. 忽略大小写 -i
- grep -i 'int_max' /usr/include/limits.h #查看INT_MAX的值
- echo 'it IT' | grep -i -w -E '([a-z]+) \1' #连个单词相同,因为忽略大小写
- echo 'it IT' | grep -E -w '([a-zA-Z]+) \1' #两个单词不同
复制代码 5. 递归查找 -r/R(posix 未说明)
- grep -i -w -r -E 'error|failed|failure' /var/log |less #查看日志的错误信息
-
复制代码 ps:
这个选项是我查找用的最多的, 鬼才知道哪个文件里包含我要的关键字。
6. 取反-v
- grep -v -w 'hello' filename #如果没有取反,世界将不再美丽
复制代码 ps:
作为程序员,没有人愿意失去取反操作
7. 匹配数 -c
- echo aaaa | grep -c 'a' #这个输出是1!因为grep是行匹配的
复制代码 ps:
可能脚本理常用吧
8. 输出文件名 -l
- grep -l -r -i -w 'key_word' /usr/include/*.h #查找包含key_word的头文件
-
复制代码 9. 只输出匹配部分-o (gnu 选项, 常用与检测正则表达式)
- echo abcddf |grep -o 'dd'
-
复制代码 ps:
每次写正则,心里都没底, 所以我就不断用这个调试。
10. 如果是纯字符串搜索,-F 速度更快。(惟吾无为 12楼补充)
做个实验:
- man gcc | tr -cs '[:alpha:]' '\n' >grep.date #用gcc manual生成个纯字符串文件作为搜索关键字
- wc -l grep.date
- 97288 #这么多!
- time `man gcc | grep -F -f grep.date > /dev/null` #比较不带-F,与带-F
- real 0m0.499s #仔细看看时间的对比!
- user 0m0.741s
- sys 0m0.056s
- time `man gcc | grep -f grep.date > /dev/null`
- real 4m9.630s #仔细看看时间的对比!
- user 4m7.602s
- sys 0m0.713s
-
复制代码 ps: 当纯字符串匹配,尤其是要匹配的字符串非常多,-F不可不用。
11. 在查找进程的时候,利用[]实现同时grep -v grep的功能
- [Bob]@[Fck_without_U]:[~]-> ps -ef | grep "java -jar"
- tdlteman 22023 22006 0 Oct07 ? 00:09:58 java -jar slave.jar
- xiabao 31501 30737 0 11:08 pts/8 00:00:00 grep java -jar ###grep 自身也出来了
- [Bob]@[Fck_without_U]:[~]-> ps -ef | grep "java -jar" | grep -v grep #-v 去掉grep进程结果
- tdlteman 22023 22006 0 Oct07 ? 00:09:58 java -jar slave.jar
- [Bob]@[Fck_without_U]:[~]-> ps -ef | grep "[j]ava -jar"
- tdlteman 22023 22006 0 Oct07 ? 00:09:58 java -jar slave.jar #看,神奇的事情发生了
-
复制代码 grep [j]ava-jar,使用了[j]就实现了-v的功能,原理很简单。
grep [j]ava-jar这个进程要在ps进程先启动,然后ps执行结束后, grep再继续运行。所以ps对其命令的记录是完全字符串的“grep [j]ava-jar”,
然后grep [j]ava-jar匹配, 但是进程解析后就是 grep java-jar。 神奇就发生了。下面的命令很清晰的呈现出来。
- ps -ef | tee pro.log | grep [b]ash
- cat pro.log | grep grep
- cu 6868 6795 0 13:07 pts/4 00:00:00 grep [b]ash
复制代码 ps:
这个技巧本不知道, 楼下一位补充的。 然后就如获珍宝啊。严格来说, 这个才是真技巧!
诚请geeks添加, 本帖长期维护。 |
|