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

原文地址:https://www.cnblogs.com/wx170119/p/12177152.html