单引号和双引号
单引号:可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么。单引号”是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换。
双引号:把双引号内的内容输出出来;如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来。双引号””是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容。
不加引号:不会将含有空格的字符串视为一个整体输出, 如果内容中有命令、变量等,会先把变量、命令解析出结果,然后在输出最终内容来,如果字符串中带有空格等特殊字符,则不能完整的输出,需要改加双引号,一般连续的字符串,数字,路径等可以用。
使用规则:一般常量用单引号”括起,如果含有变量则用双引号””括起。
最大不同:单引号与双引号的最大不同在于双引号仍然可以保有变数的内容,但单引号内仅能是一般字元,而不会有特殊符号
使用举例:
“”号里面遇到$,等特殊字符会进行相应的变量替换
”号里面的所有字符都保持原样
对于字符串,两者相同,匹配模式也大致相同,但有一些区别非常容易混淆
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
最新评论