[/code]
3.善用-E(启用 extended expression,正则写起来更加灵活,省去很多的\,正则功能更强大)
[code]
man gcc | grep -E '(\
man gcc | grep -E -w '(the|that|and|or) \1'
man gcc | grep -E -w '([a-zA-Z]+) \1'#查看gcc帮助文件里含两个连续单词的行
[/code]
4. 忽略大小写 -i
[code]
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' #两个单词不同
[/code]
5. 递归查找 -r(posix 未说明)
[code]
grep -i -w -r -E 'error|failed|failure' /var/log |less #查看日志的错误信息
[/code]
6. 取反-v
[code]
grep -v -w 'hello' filename #如果没有取反,世界将不再美丽
[/code]
7. 匹配数 -c
[code]
echo aaaa | grep -c 'a' #这个输出是1!因为grep是行匹配的
[/code]
8. 输出文件名 -l
[code]
grep -l -r -i -w 'key_word' /usr/include/*.h #查找包含key_word的头文件
[/code]
9. 只输出匹配部分-o (gnu 选项, 常用与检测正则表达式)
[code]
echo abcddf |grep -o 'dd'
[/code]
10. 如果是纯字符串搜索,-F 速度更快。(惟吾无为 12楼补充)
做个实验:
[code]
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
[/code]
NOTE: 当纯字符串匹配,尤其是要匹配的字符串非常多,-F不可不用。
11. 在查找进程的时候,利用[]实现同时grep -v grep的功能
[code]
[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 #看,神奇的事情发生了
[/code]