释放双眼,带上耳机,听听看~!
通配符
通配符是由shell处理的, 它只会出现在 命令的“参数”里。当shell在“参数”中遇到了通配符时,shell会将其当作路径或文件名去在磁盘上搜寻可能的匹配:若符合要求的匹配存在,则进行代换(路径扩展);否则就将该通配符作为一个普通字符传递给“命令”,然后再由命令进行处理。总之,通配符 实际上就是一种shell实现的路径扩展功能。在 通配符被处理后, shell会先完成该命令的重组,然后再继续处理重组后的命令,直至执行该命令。
SHELL中的通配符
帮助手册:# man 7 glob
*匹配任意长度的任意字符,可以是0个
?匹配任意单个字符,必须是1个
[ ]匹配指定字符范围内的任意单个字符
[a-z,A-Z,0-9]匹配所有数字字母,可以不加逗号
[a-z]表示a-z,A-Y,表示a,A,b,B…..a。不包含Z
[A-Z]表示A,b,B…..z,Z。不包含a
[a-Z]表示所有大小写字母
[:upper:]所有大写字母
[:lower:]所有小写字母
[:alpha:]所有字母,大小写
[:digit:]所有数字
[:alnum:]所有数字+字母
[:blank:]水平空白字符
[:space:]水平或垂直空白字符
[:punct:]标点符号
[:print:]可打印字符
[:cntrl:]控制(非打印)字符
[:graph:]图形字符
[:xdigit:]十六进制字符
[^]匹配指定字符范围外的任意单个字符
[^0-9]相当于[^[:digit:]]
[^a-z]表示Z + 其他
[^A-Z]表示a + 其他
示例:
搜索/etc/目录下以“.d”结尾的目录及文件,并列出详细信息:ls -l /etc/*.d
删除当前目录下所有文件及目录:rm -rf *
有1-100整数的文件,列出2、3、4,列出 2 、3、4开头 5、6结尾的所有文件
以?搜索文件
列出2以外的文件
转义字符
有时候,我们想让 通配符,或者元字符 变成普通字符,不需要使用它。那么这里我们就需要用到转义符了。 shell提供转义符有三种。
字符说明
‘’(单引号)硬转义,其内部所有的shell 元字符、通配符都会被关掉。
“”(双引号)软转义,其内部只允许出现特定的shell 元字符:$用于参数替换 `(反单引号,esc键下面)用于命令替换
\(反斜杠)又叫转义,去除其后紧跟的元字符或通配符的特殊意义
示例
正则表达式
正则表达式基础
概念
正则表达式,又被正规表示式、正规表示法、针对表达式、规格表达式、常规表达法(Regular Expression,或regex、regexp、RE)。正则表达式使用单个字符来描述、匹配一系列符合某个句法规则的字符串。在很多编辑器里,正则表达式通常用来检索、替换那些符合某个模式的文本。
注意区分正则表达式与通配符的差别。
例子:
一个文件中,包含“shiguang”和“shiyan”这两个字符,同样一个表达式:shi*
如果上述表达式作为正则表达式,它将只能匹配shi;而如果不是正则表达式,而是作为一个通配符,则将同时匹配两个字符串。
原因:在正则表达式中,*表示匹配前面的子表达式零次或多次,比如它可以匹配”sh”,”shi”,”shii”,”shishi”等等,而作为通配符,*表示匹配通配符后面任意多个字符,所以可以匹配文本中的字符串。
选择
|表示分割,比如: boy | gril可以匹配“boy”或者“girl”
在正则表达式的使用过程中,一些字符是以特定方式处理的。最常使用的特殊字符如下:
字符表示*匹配前一个字符0-任意次。
+匹配前一个字符1-任意次。
?匹配前一个字符0或1次。
.匹配换行符以外任意一个字符
^匹配首。^baozi表示以baozi开头的。
$匹配尾。baozi$表示以baozi结尾的。
[]匹配括号中任意一个字符。
[^]匹配[]取反。
\转义符。
\{n\}匹配n次。
\{n,\}匹配不小于n次。
\{n,m\}匹配最小n次,最多m次。
\d任意数字
\w任意字母、数字、_
\s任意空白字符
#从左到右匹配,删掉第一个
##从左到右匹配,删掉全部
%从右开始,与#相反
%%从右开始,与##相反如果想将上述字符用作普通字符,就需要在它们前面加上\字符。例如,如果想使用$字符,你需要将它写为\$
在方括号中还可以使用一些有用的特殊匹配模式,如下:
匹配模式含义
[:alnum:]字母与数字字符,如grep[[:alnum:]] words.txt
[:alpha:]字母
[:ascii:]ASCII字符
[:blank:]空格或制表符
[:cntrl:]ASCII控制字符
[:digit:]数字
[:graph:]非控制、非空格字符
[:lower:]小写字母
[:print:]可打印字符
[:punct:]标点符号字符
[:space:]空白字符,包括垂直制表符
[:upper:]大写字母
[:xdigit:]十六进制数字
示例
在/etc/中匹配d为首的文件,匹配d为结尾的文件
ls .* :其中“.”表示任意字符,“*”表示任意长度。所以第一行可以列出隐藏文件,第二行就是所有文件(相当于“ls . 或 ls”),第三行则是上一目录的文件(相当于“ls ..”)。而“.”三个的时候,ls …以上就没有意义,命令错误了,所以不再显示。
将/etc/passwd文件做输出保存在当前目录下继续用于做测试。其中cat test99.txt | grep “^a….e”匹配test99.txt中以a开头的行,并且向后任意4个字符,第五个为e。
a[dv]匹配的是ad,av
“[^]”表示取反,意思是匹配除此以外的字符。”a[^dv]”则会匹配ad,av,以外的字符
其中”10{2}”表示匹配两个0, “10{2,}”表示匹配两个及两个以上的0.
“\s{1,\}”其中“\s”表示空格,“{1,}表示匹配1次及以上”
“\w”表示所有字符
[:digit:]表示数字