Chinaunix首页 | 论坛 | 博客
  • 博客访问: 83005
  • 博文数量: 18
  • 博客积分: 454
  • 博客等级: 下士
  • 技术积分: 237
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-03 13:38
文章分类

全部博文(18)

文章存档

2012年(18)

分类: LINUX

2012-04-18 20:18:01

建议对文中命令进行亲自尝试与检验。
1. 多个关键字查找
        1.1 关键字间or操作(-e选项; 元字符\|; -f file)
        [code]
        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 看着舒服
        grep -l -f multi_pattern.txt /usr/include/*.h
        [/code]

NOTE: -e 选项还可以避免 关键字是-开头的导致选项解读失败。
        1.2 关键字间and操作(通过管道|; 通过正则)
    [code]
    echo hello world | grep '\' | grep '\'#同时包含'hello','world'的行
    grep -E 'pattern1.*pattern2|pattern2.*pattern1'#2个关键字还好,要是n个关键字!      
    [/code]

2. 匹配单词(-w gnu选项; \<\>)
    [code]
    grep -w 'main' /usr/include/*.h#这个-w很方便
    grep '\' /usr/include/*.h   
    [/code]

3.善用-E(启用 extended expression,正则写起来更加灵活,省去很多的\,正则功能更强大)
        [code]
        man gcc | grep -E '(\|\|\|\) \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帮助文件里含两个连续单词的行
        [/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]
阅读(3657) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~