zoukankan      html  css  js  c++  java
  • grep命令详解;单引号和双引号区别(转载)

      

    单引号和双引号
    单引号:可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。
     
    双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
     
    不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
     
    使用规则:一般常量用单引号''括起,如果含有变量则用双引号""括起。
     
    最大不同:单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元,而不会有特殊符号
     
    使用举例:
    ""号里面遇到$,等特殊字符会进行相应的变量替换
    ''号里面的所有字符都保持原样
    对于字符串,两者相同,匹配模式也大致相同,但有一些区别非常容易混淆
    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执行的是相同的命令
    还有一种情况是查找的内容含有单引号,也含有变量如$HOME,如文件:
    "$HOME'
    这时候 grep '"$HOME''的话,因为内容有单引号,第一个单引号会和倒数第二个单引号匹配,导致找不到正确内容,这里只能用双引号(如有单引号方法可以留言讨论),即grep ""$HOME'"。
    结论:当grep的字符串中有单引号时,需要使用双引号,以防止单引号匹配错误。但这也会导致不想转换的变量被双引号转换,只能用转义。
     
    常用选项
    复制代码
    -E :开启扩展(Extend)的正则表达式,相当于egrep
    -e:同时匹配多个目标
    -i :忽略大小写(ignore case)
    -v:反向查找(invert),只打印没有匹配的,而匹配的反而不打印。
    -n:显示行号
    -i:忽略大小写
    -c:显示总共有多少行被匹配到了,而不是显示被匹配到的内容,注意如果同时使用-cv选项是显示有多少行没有被匹配到。
    -P:使用兼容perl的正则
    -w:被匹配的文本只能是单词,而不能是单词中的某一部分,也就是精确匹配。如文本中有liker,而我搜寻的只是like,就可以使用-w选项来避免匹配liker
    fgrep: 不支持正则表达式,只能匹配写死的字符串,但是速度奇快,效率高,fastgrep
    -o:只显示被模式匹配到的字符串。
    -q:静默模式,只关心有没有匹配到,不关心内容
    --color :将匹配到的内容以颜色高亮显示,centos7默认已经高亮。
    -A n:显示匹配到的字符串所在的行及其后n行,after
    -B n:显示匹配到的字符串所在的行及其前n行,before
    -C n:显示匹配到的字符串所在的行及其前后各n行,context
    复制代码
    例子:
    1、去除空行;去除注释行;去除空行和注释行
    grep -v '^$' abc.txt
    grep -v '^#' abc.txt
    egrep -v '^$|^#' abc.txt 或 grep -Ev '^$|^#' abc.txt 或 grep -Ev "^$|^[#;]" abc.txt
     
    grep的规则表达式
    复制代码
     反义字符:如""""表示匹配""
    [ - ] 匹配一个范围,[0-9a-zA-Z]匹配所有数字和字母
    * 所有字符,长度可为0
    + 前面的字符出现了一次或者多次
    ^ #匹配行的开始 如:'^grep'匹配所有以grep开头的行。
    $ #匹配行的结束 如:'grep$'匹配所有以grep结尾的行。
    . #匹配一个非换行符的字符 如:'gr.p'匹配gr后接一个任意字符,然后是p。
    * #匹配零个或多个先前字符 如:'*grep'匹配所有一个或多个空格后紧跟grep的行。
    .* #一起用代表任意字符。
    [] #匹配一个指定范围内的字符,如'[Gg]rep'匹配Grep和grep。
    [^] #匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
    (..) #标记匹配字符,如'(love)',love被标记为1。
    < #到匹配正则表达式的行开始,如:'<grep'匹配包含以grep开头的单词的行。
    > #到匹配正则表达式的行结束,如'grep>'匹配包含以grep结尾的单词的行。
    x{m} #重复字符x,m次,如:'0{5}'匹配包含5个o的行。
    x{m,} #重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。
    x{m,n} #重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5--10个o的行。
    w #匹配文字和数字字符,也就是[A-Za-z0-9],如:'Gw*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
    W #w的反置形式,匹配一个或多个非单词字符,如点号句号等。
     #单词锁定符,如: 'grep'只匹配grep。
    复制代码

    POSIX字符:

    为了在不同国家的字符编码中保持一至,POSIX(The Portable Operating System Interface)增加了特殊的字符类,如[:alnum:]是[A-Za-z0-9]的另一个写法。要把它们放到[]号内才能成为正则表达式,如[A- Za-z0-9]或[[:alnum:]]。在linux下的grep除fgrep外,都支持POSIX的字符类。
    复制代码
    [:alnum:] #文字数字字符
    [:alpha:] #文字字符
    [:digit:] #数字字符
    [:graph:] #非空字符(非空格、控制字符)
    [:lower:] #小写字符
    [:cntrl:] #控制字符
    [:print:] #非空字符(包括空格)
    [:punct:] #标点符号
    [:space:] #所有空白字符(新行,空格,制表符)
    [:upper:] #大写字符
    [:xdigit:] #十六进制数字(0-9,a-f,A-F)
    复制代码

    例子:

    1、匹配文件中所有单词,并打印出来
    grep -E -o "[[:alpha:]]+" abc.txt
    # [[:alpha:]]表示字母
    # [[:alpha:]]+表示多个字母
    # 表示边界,其前后必须是不同类型的字符
    # [[:alpha:]]+合起来表示一个单词

    本文转自:https://www.cnblogs.com/zhushuaishuai/p/10843416.html

  • 相关阅读:
    Longest Consecutive Sequence 分类: Leetcode(线性表) 2015-02-04 09:54 55人阅读 评论(0) 收藏
    Median of Two Sorted Arrays 分类: Leetcode(线性表) 2015-02-04 09:05 54人阅读 评论(0) 收藏
    Python+Scrapy(完整包全安装过程) 分类: 安装配置说明 2015-02-02 21:29 108人阅读 评论(0) 收藏
    Remove Element 分类: Leetcode(线性表) 2015-01-29 10:47 55人阅读 评论(0) 收藏
    Search in Rotated Sorted Array 分类: Leetcode(线性表) 2015-01-29 10:23 58人阅读 评论(0) 收藏
    机器学习基础(四)LMS,代价函数的求解和概率意义 分类: 机器学习 2015-01-26 14:52 114人阅读 评论(0) 收藏
    机器学习基础(一)线性回归
    AcWing1341. 十三号星期五
    JavaWebServle执行流程解析
    AcWing 466. 回文日期
  • 原文地址:https://www.cnblogs.com/wx170119/p/12177152.html
Copyright © 2011-2022 走看看