• 【Linux】grep命令


    grep和egrep

    例子:
    1. :
    格式: grep [option] pattern filename 注意: pattern如果是表达式或者超过两个单词的, 需要用引号引用. 可以是单引号也可双引号, 区别是单引号无法引用变量而双引号可以.

    grep '\<Tom\>' file   包含单词Tom的行
    grep 'Tom savage' file 包含Tom savage的行
    grep '^Tommy' file 包含以Tommy开头的行
    grep '\.bak$' file 包含以.bak结束的行
    grep '[Pp]yramid' file 包含pyramid 或Pyramid的单词的行
    grep '[A-Z]' file 包含至少一个大写字母的行
    grep '[0-9]' file 包含至少一个数字的行
    grep '[A-Z]...[0-9]' file 包含五个字符,以大写开头, 和一个数字结尾的行.
    grep -w '[tT]est' file 包含单词和test的行.
    grep -s 'ken sun' file 找到包含ken sun的行, 但不打印行, 而是用来检查退出状态.
    grep -v aaa file 打印不包含aaa的行.
    grep -i cathy file 打印所有包含cathy的行, 而不考虑大小些.
    grep -l 'dear cathy' * 打印包含dear cathy的文件的文件名清单.
    grep -n tom file   打印匹配的行并追加行号.
    grep "$LOGNAME" file 包含变量内容的行, 注意必须用双引号, 单引号则无法引用变量.
    grep '$name' file 打印包含字符$name的行.


    2 : egrep = grep -E 可以使用基本的正则表达外, 还可以用扩展表达式. 注意区别.
    扩展表达式:
    + 匹配一个或者多个先前的字符, 至少一个先前字符.
    ? 匹配0个或者多个先前字符.
    a|b|c 匹配a或b或c
    () 字符组, 如: love(able|ers) 匹配loveable或lovers.
    (..)(..)\1\2 模板匹配. \1代表前面第一个模板, \2代第二个括弧里面的模板.
    x{m,n} =x\{m,n\} x的字符数量在m到n个之间.

    egrep '^+' file   以一个或者多个空格开头的行.
    grep '^*' file   同上
    egrep '(TOM|DAN) SAVAGE' file 包含 TOM SAVAGE 和DAN SAVAGE的行.
    egrep '(ab)+' file 包含至少一个ab的行.
    egrep 'x[0-9]?' file 包含x或者x后面跟着0个或者多个数字的行.
    egrep 'fun\.$' * 所有文件里面以fun.结尾的行.
    egrep '[A-Z]+' file 至少包含一个大写字母的行.
    egrep '[0-9]' file 至少一个数字的行.
    egrep '[A-Z]...[0-9]' file 有五个字符, 第一个式大写, 最后一个是数字的行.
    egrep '[tT]est' file 包含单词test或Test的行.
    egrep 'ken sun' file 包含ken sun的行.
    egrep -v 'marry' file 不包含marry的行.
    egrep -i 'sam' file 不考虑sam的大小写,含有sam的行.
    egrep -l "dear ken" * 包含dear ken的所有文件的清单.
    egrep -n tom file 包含tom的行, 每行前面追加行号.
    egrep -s "$name" file 找到变量名$name的, 不打印而是显示退出状态. 0表示找到. 1表示表达式没找到符合要求的, 2表示文件没找到.

    3 fgrep 很简单就是固化表达式的搜索.如:

    fgrep "$name...[a-z]" file 就是在file里面找到和字符$name...[a-z]一样的行. 其中$和...等没有转义的意义.
     

    环境:VirtualBox4.1 + RedHat Linux 6 + Putty0.62

    单引号:

    可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。

    双引号:

    把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。

    不加引号:

    不会将含有空格的字符串视为一个整体输出,如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。

    使用规则:

    一般常量用单引号''括起,如果含有变量则用双引号""括起。

    最大不同:

    单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字

    元,而不会有特殊符号

    使用举例:

    “”号里面遇到$,\等特殊字符会进行相应的变量替换

    ‘’号里面的所有字符都保持原样

    对于字符串,两者相同

    匹配模式也大致相同

    但有一些区别非常容易混淆

    grep "$a" file        #引用变量a,查找变量a的值

    grep '$a' file        #查找“$a”字符串

    grep "\\" file        #grep: Trailing backslash(不知原因)

    grep '\\' file        #查找‘\’字符

    1、$美元符

    2、\反斜杠

    3、`反引号

    4、" 双引号

    这四个字符在双引号中是具有特殊含义的,其他都没有,而单引号使所有字符都失去特殊含义

    如果用双引号,查找一个\,就应该用四个\:

    grep "\\\\" file这样就对了,这样等同于:

    grep '\\' file

    第一条命令shell把四个\,转义成2个\传递给grep,grep再把2个\转义成一个\查找

    第二条命令shell没转义,直接把2个\传递给grep,grep再把2个\转义成一个\查找

    其实grep执行的是相同的命令。

    参考资料:

    http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=218853&page=4

    http://bbs.chinaunix.net/thread-588454-1-1.html

    http://hi.baidu.com/michael7768/blog/item/33e6c15295e9c2160cf3e391.html

    http://sunyu.blog.51cto.com/744725/799589
     
    http://blog.csdn.net/justdb/article/details/7539567
     
  • 相关阅读:
    二进制,八进制,十进制,十六进制之间的转换
    using关键字的使用
    简单工厂和单例设计模式
    面向对象的七种设计原则
    第六章 初始继承和多态
    第五章项目:体检套餐管理系统
    第二章《深入C#数据类型》项目经理评分
    <<MySchool数据库设计优化>> 内部测试
    Python 日志处理(一) 按Nginx log_format 分割日志记录
    Python 爬虫练习(一) 爬取国内代理ip
  • 原文地址:https://www.cnblogs.com/dracohan/p/2942810.html
Copyright © 2020-2023  润新知