shell通配符与正则表达式

    通配符是系统level的 而正则表达式需要相关工具的支持: egrep, awk, vi, perl。在文本过滤工具里,都是用正则表达式,比如像awk,sed等,是针对文件的内容的。通配符多用在文件名上,比如查找find,ls,cp,等等。

1.通配符      

(1)通配符语法:*      
* 将与零个或多个字符匹配。这就是说“什么都可以”。例子:      
  /etc/g* 与 /etc 中以 g 开头的所有文件匹配。      
  /tmp/my*1 与 /tmp 中以 my 开头,并且以 1 结尾的所有文件匹配。      
(2)通配符语法:?      
? 与任何单个字符匹配。例子:      
  myfile? 与文件名为 myfile 后跟单个字符的任何文件匹配。      
  /tmp/notes?txt 将与 /tmp/notes.txt 和 /tmp/notes_txt 都匹配,如果它们存在。      
(3)通配符语法:[]      
    该通配符与 ? 相似,但允许指定得更确切。要使用该通配符,把您想要匹配的所有字符放在 [] 内。结果的表达式将与 [] 中任一字符相匹配。您也可以用 – 来指定范围,甚至还可以组合范围。例子:      
    myfile[12] 将与 myfile1 和 myfile2 匹配。只要当前目录中至少有一个这样的文件存在,该通配符就可以进行扩展。      
    [Cc]hange[Ll]og 将与 Changelog、ChangeLog、changeLog 以及 changelog 匹配。您可以看到,与大写形式的变形匹配时,使用括弧通配符很有用。      
    ls /etc/[0-9]* 将列出 /etc 中以数字开头的所有文件。      
    ls /tmp/[A-Za-z]* 将列出 /tmp 中以大写字母或小写字母开头的所有文件。

(4)通配符语法:[!]       
    除了不与括弧中的任何字符匹配外,[!] 构造与 [] 构造类似,只要不是列在 [! 和 ] 之间的字符,它将与任何字符匹配。例子:        
     rm myfile[!9] 将删除除 myfile9 之外的名为 myfile 加一个字符的所有文件。        
    通配符告诫说明        
    这里有一些使用通配符时应该注意的告诫说明。由于 bash 对与通配符相关的字符(?、[、]、*)进行特别处理,因此您将包含这些字符的参数输入到命令中时,需要特别小心。例如,如果您想要创建一个包含字符串 [fo]* 的文件,下面这个命令可能不会执行您想要做的事:        
    $ echo [fo]* > /tmp/mynewfile.txt        
    如果 [fo]* 这个模式与当前工作目录中的任何文件匹配,那么您将在 /tmp/mynewfile.txt 内发现那些文件的名称,而不是您所期望的文字 [fo]*。解决方法是什么呢?嗯,一种方法是用单引号把这些字符括起来,这将告诉 bash 单纯地执行,而不会对其进行通配符扩展:        
    $ echo '[fo]*' > /tmp/mynewfile.txt        
采用这种方法,您的新文件将包含所期望的文字的 [fo]*。另一种方法是,您可以使用反斜杠,告诉 bash [、] 和 * 应该被当成文字处理,而不是被当成通配符处理:        
    $ echo \[fo\]\* > /tmp/mynewfile.txt        
两种方法都能同样地起作用。既然我们谈到反斜杠扩展,那么现在是时候提一提了,为了指定文字\,您可以将它放入单引号中,或者也可以输入\\(它将被扩展为\)。        
    请注意双引号的作用和单引号很接近,而双引号还允许 bash 做一些有限的扩展。因此,当您确实想要把文字文本传给命令时,单引号是最好的选择。

(5)专用字符集合

  [:digit:]:任意数字,相当于0-9

  [:lower:]:任意小写字母

  [:upper:]:任意大写字母

  [:alpha:]:任意大小写字母

  [:alnum:]:任意数字或字母

  [:space:]:空格

  [:punct:]:标点符号

    注意:引用时,需要在加一层括号

2.正则表达式

1、什么是正则表达式?       
    正则表达式(也称为“regex”或“regexp”)是一种用来描述文本模式的特殊语法。在 Linux 系统上,正则表达式通常被用来查找文本的模式,以及对文本流执行“搜索-替换”操作以及其它功能。        
2、与 glob 的比较        
   当我们看到正则表达式时,您可能发现正则表达式的语法看起来与我们上一篇教程(请参阅本教程最后的“参考资料”一节中列出的“第 1 部分”)中研究的“文件名匹配替换”语法相类似。但是,不要让它欺骗您;它们的类似性只是表面的。虽然正则表达式和文件名匹配替换模式可能看上去相类似,但是它们是根本不同的两种类型。        
3、简单子串        
   记住那个警告,让我们看一下最基本的正则表达式,简单子串。为了这样做,我们要使用 grep,它是一个扫描文件内容来查找适合特定正则表达式的命令。grep 打印与正则表达式匹配的每一行,并忽略与之不匹配的每一行:        
$ grep bash /etc/passwd        
operator:x:11:0:operator:/root:/bin/bash        
root:x:0:0::/root:/bin/bash        
ftp:x:40:1::/home/ftp:/bin/bash        
在上面的命令中,grep 的第一个参数是一个正则表达式;第二个参数是一个文件名。grep 读取 /etc/passwd 中的每一行并对它应用简单子串正则表达式 bash 来查找匹配项。如果找到一个匹配项,那么 grep 打印出整行;否则,忽略该行。        
4、理解简单子串        
    一般来说,如果您正在搜索一个子串,那么您可以不提供任何“特殊”字符,而只是逐字地指定文本。只有在子串包含 +、.、*、[、] 或 /(在这样的情况下,这些字符需要用引号括起来并在它们的前面使用反斜杠)才需要做特殊的事情。下面是简单子串正则表达式几个其它示例:        
   tmp (扫描查找文字串 tmp)        
 “\[box\]”(扫描查找文字串 [box])        
 “\*funny\*”(扫描查找文字串 *funny*)        
 “ld\.so”(扫描查找文字串 ld.so)        
5、元字符        
    使用正则表达式,可以利用元字符来执行比我们至今已研究过的示例复杂得多的搜索。这些元字符中的一个是 .(点),它与任何单个字符匹配:        
$ grep dev.hda /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap sw 0 0        
#/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        
    在本示例中,文字文本 dev.hda 没有出现在 /etc/fstab 中的任何一行中。但是,grep 扫描这些行时没有查找文字 dev.hda 字符串,而是查找 dev.hda 模式。请记住 . 将与任何单个字符相匹配。正如您看到的,. 元字符在功能上等价于 glob 扩展中 ? 元字符的工作原理。        
6、使用 []        
   如果我们希望与比 . 更具体一点地来匹配字符,那么我们可以使用 [ 和 ](方括号)来指定要匹配的字符子集:        
$ grep dev.hda[12] /etc/fstab        
/dev/hda1 /boot reiserfs noauto,noatime,notail 1 2        
/dev/hda2 swap swap sw 0 0  

 [\u4e00-\u9fa5] : 表示任意一个汉字 
 正如您看到的,这个特殊语法的作用与“glob”文件名扩展中的 [] 相同。        
7、使用 [^]        
    通过使 [ 后面紧跟一个 ^,您可以使方括号中的意思相反。在本例中,方括号将与未列在方括号内的任意字符匹配。同样,请注意我们在正则表达式中使用 [^] ,而在 glob 中使用 [!] :        
$ grep dev.hda[^12] /etc/fstab        
/dev/hda3 reiserfs noatime,ro 1 1        
/dev/hda4 /mnt/extra reiserfs noatime,rw 1 1        
8、区别语法        
    注意下面一点很重要:方括号内部的语法根本不同于正则表达式其它部分中的语法。例如,如果在方括号内放置一个 . ,那么它允许方括号与文字 . 匹配,就象上面示例中的 1 和 2。比较起来,除非有\ 作为前缀,否则方括号外面的文字 . 被解释为一个元字符。通过输入如下命令,我们可以利用这一事实来打印 /etc/fstab 中包含文字串 dev.hda 的所有行的列表:        
$ grep dev[.]hda /etc/fstab        
或者,我们也可以输入:        
$ grep "dev\.hda" /etc/fstab        
这两个正则表达式都不可能与您的 /etc/fstab 文件中的任何行相匹配。        
9、“*”元字符        
    某些元字符本身不匹配任何字符,但却修改前一个字符的含义。一个这样的元字符是 * (星号),它用来与前一个字符的零次或者多次重复出现相匹配。这里是一些示例:        
 ab*c(与 abbbbc 匹配但不与 abqc 匹配)        
 ab*c(与 abc 匹配但不与 abbqbbc 匹配)        
 ab*c(与 ac 匹配但不与 cba 匹配)        
 b[cq]*e(与 bqe 匹配但不与 eb 匹配)        
 b[cq]*e(与 bccqqe 匹配但不与 bccc 匹配)        
 b[cq]*e(与 bqqcce 匹配但不与 cqe 匹配)        
 b[cq]*e(与 bbbeee 匹配)        
 .*(与任何字符串匹配)        
 foo.*(与以 foo 开始的任何字符串相匹配)        
 ac 行与正则表达式 ab*c 相匹配,因为星号也允许前面的表达式(b)出现零次。请注意解释 * 正则表达式元字符所用的方法与解释 * glob 字符的方法根本不同。        
10、行的开始和结束        

    我们在这里要详细描述的最后几个元字符是 ^ 和 $ 元字符,它们用来分别与行的开始和结束相匹配。通过在正则表达式开始处使用一个 ^ ,您可以将您的模式“锚定”在行的开始。在下面的示例中,我们使用 ^# 正则表达式来与以 # 字符开始的任何行相匹配:        
$ grep ^# /etc/fstab        
# /etc/fstab: static file system information.        
#        
11、完整行正则表达式        
    可以组合 ^ 和 $ 来与完整的行相匹配。例如,下面的正则表达式将与以 # 字符开始并以 . 字符结束的行相匹配,在其中间可以有任意多个其它字符:        
$ grep '^#.*/.$' /etc/fstab        
# /etc/fstab: static file system information.        
在上面的示例中,我们用单引号将我们的正则表达式括起来以阻止 shell 解释 $ 。在不使用单引号的情况下,grep 甚至没有机会查看 $,$ 就从我们的正则表达式上消失了。

正则总结(转)

元字符        
    .     :
小数点可以匹配除“\n”以外的任意一个字符。如果要匹配包括“\n”在内的所有字符,一般用[\s\S],或者是用“.”加(?s)匹配模式来实现。        
    [abc] :匹配方括号中的任意一个字符。可以使用-表示字符范围,如[a-z0-9]匹配小写字母和阿拉伯数字。        
    [^abc] :在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。       |    : 表示或 
\d 匹配阿拉伯数字,等同于[0-9]。        
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。        
\x 匹配十六进制数字,等同于[0-9A-Fa-f]。        
\X 匹配十六进制数字,等同于[^0-9A-Fa-f]。        
\w 匹配单词字母,等同于[0-9A-Za-z_]。        
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。        
\t 匹配<TAB>字符。        
\s 匹配空白字符,等同于[ /t]。        
\S 匹配非空白字符,等同于[^ /t]。        
\a 所有的字母字符. 等同于[a-zA-Z]        
\l 小写字母 [a-z]        
\L 非小写字母 [^a-z]        
\u 大写字母 [A-Z]        
\U 非大写字母 [^A-Z]        

表示数量的元字符

        
元字符         说明        
*              匹配0-任意个        
\+             匹配1-任意个        
\?             匹配0-1个        
\{n,m\}        匹配n-m个        
\{n\}          匹配n个        
\{n,\}         匹配n-任意个        
\{,m\}         匹配0-m个        

换行符         说明

\r,\n          回车和换行

\\             匹配‘\’

\^,\$,\.       匹配“^”“$”“.”    

以下字符在匹配其本身时,通常需要进行转义。在实际应用中,根据具体情况,需要转义的字符可能不止如下所列字符 : $  ^  {  [  (  |  )  *  +  ?  \  
表示位置的符号    
$   匹配行尾     
^   匹配行首      
\<  匹配单词词首      
\>  匹配单词词尾  
   
\b  匹配单词边界 
 

      

   
    
   

原创文章,作者:血刀老祖,如若转载,请注明出处:http://www.178linux.com/11356

(1)
血刀老祖血刀老祖
上一篇 2016-02-28
下一篇 2016-02-28

相关推荐

  • grep,egrep及相应的正则表达式用法详解

    目录 1、grep简介     1.1、grep是什么     1.2、grep使用格式     1.3、grep常用选项 2、正则表达式与grep     2.1、正则表达式简介  &nb…

    系统运维 2016-08-22
  • LVS详解

    LVS详解 LVS(Linux Virtual Server),意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。 LVS 是一个工作在四层的负载均衡器,实现和 iptables/netfilter 类似,工作在内核空间的 TCP/IP 协议栈上,LVS 工作在 INPUT H…

    Linux干货 2016-11-11
  • 基于nginx实现7层http的负载均衡

    一、实验环境实验环境为三台服务器:1. nginx负载均衡器1. 内网ip:192.168.11.1002. 外网ip:172.16.251.892. 提供网页服务的RS-1服务器:192.168.11.2013. 提供网页服务的RS-2服务器:192.168.11.2024. 拓扑如下:二、实验配置后台服务器配置:1. 后台提供网页服务的两台服务器配置:y…

    Linux干货 2017-06-29
  • Linux程序包管理

      Linux的各个release版本开发商,在发布各种应用程序,以及一些团体发布应用程序时,通常会根据发布的程序所适应的开发语言,使用环境,预设参数等,事先编译完成一个可以在相应平台上安装的程序包供使用者直接使用,该程序包含有安装前(preinstall)操作系统环境检测的脚本,程序包中所有文件的相关信息,程序预定义的配置参数文件,程序…

    Linux干货 2016-11-30
  • 文本查看及处理工具

    文本查看及处理工具 wc wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数 语法 wc(选项)(参数) 选项 -c或–bytes或——chars:只显示Bytes数; -l或——lines:只显示列数; -w或——words:只显示字数。 参数 文件:需要统计的文件列表 实例 [root@localhost tmp]# cat …

    Linux干货 2018-03-18
  • 磁盘管理总结

    linux磁盘管理总结 一、向linux主机添加硬盘 不同类型的硬盘,linux需要不同的驱动。kernel需要驱动,硬盘是基本的硬件设备,驱动一般不需要安装了。 (1)linux内核的设计架构,使用了模块。除了系统必须的驱动,一般以模块方式加载到内核中。内核的模块放在。/lib/modules内。 (2)linux一切皆文件,设备也是文件,ls -l 查看…

    Linux干货 2016-08-29

评论列表(1条)

  • stanley
    stanley 2016-02-28 12:20

    写的不错,你将拥有自主发布文章的权限,相信会一如既往的好