TLCL之第三章(3)


第三章


5. 归档和备份

计算机系统管理员的一个主要任务就是保护系统的数据安全,其中一个方法就是实时备份系统文件来保护数据。
文件压缩程序

命令含义
gzip压缩或者展开文件
bzip2块排序文件压缩器

归档程序

命令含义
tar磁带打包工具
zip打包和压缩文件

文件同步程序

命令含义
rsync同步远端文件和目录

1. 压缩文件

数据压缩就是一个删除冗余数据的过程。
压缩算法分为两大类,无损压缩和有损压缩。无损压缩保留了原始文件的所有数据。这意味着,当还原一个压缩文件的时候,还原的文件与原文件一模一样。而有损压缩,执行压缩操作时会删除数据,允许更大的压缩,当一个有损文件被还原的时候,它与原文件不相匹配,它是一个近似值。有损压缩的例子有JPEG(图像)文件和MP3(音频)文件。

  1. gzip

gzip程序被用来压缩一个或多个文件,当执行gzip命令时,则原始文件的压缩版会代替原始文件,相对应的gunzip程序被用来把压缩文件复原为没有被压缩版本。

[me@linuxbox ~]$ ls -l /etc > foo.txt
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me     me 15738 2008-10-14 07:15 foo.txt
[me@linuxbox ~]$ gzip foo.txt
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me     me 3230 2008-10-14 07:15 foo.txt.gz
[me@linuxbox ~]$ gunzip foo.txt.gz
[me@linuxbox ~]$ ls -l foo.*
-rw-r--r-- 1 me     me 15738 2008-10-14 07:15 foo.txt

gzip选项

选项长选项含义
-c–stdout或–to-stdout把输出写入到标准输出,并且保留原始文件
-d–decompress或者–uncompress解压缩。正如gunzip命令一样。
-f–force强制压缩,即使原始文件的压缩已经存在也会执行
-h–help显示用法信息
-l–list列出每个被压缩文件的压缩数据
-r–recursive若命令的一个或多个参数是目录,则递归地压缩目录中的文件
-t–test测试压缩文件的完整性
-v–verbose显示过程中的信息
-numberNone设置压缩指数。number是一个在1(最快,最小压缩)到9(最慢,最大压缩)之间的整数,数值1和9也可以各自用–fast和–best选项来表示。默认值是整数6

另外,对应于gzip还有一个程序,叫做zcat,它等同于带有-c选项的gunzip命令,它可以被用来如cat命令作用于gzip压缩文件:

[me@linuxbox ~]$ zcat foo.txt.gz | less
#等同于下面的命令
[me@linuxbox ~]$ zless foo.txt.gz
  1. bzip2

与gizp程序相似,使用了不同的压缩算法,舍弃了压缩速度,而实现了更高的压缩级别。在大多数情况下,它的工作模式等同于gzip,由bzip2压缩的文件,用扩展名.bz2来表示。
bzip2程序使用起来和gzip程序一样,之前讨论的gzip程序的所有选项(除了-r),bzip2程序同样也支持。注意,压缩级别选项(-number)对于bzip2来说,有少许不同的含义。伴随着bzip2程序,有bunzip2和bzcat程序来解压缩文件。bzip2文件也带有bzip2recover程序,其会试图恢复受损的.bz2文件。

2. 归档文件

一个常见的与文件压缩结合一块使用的文件管理任务是归档。
归档就是收集许多文件,并把它们捆绑成一个大文件的过程。
归档经常作为系统备份的一部分来使用,当把旧数据从一个系统移到某种类型的长期存储设备中时,也会用到归档程序。

  1. tar

tap archive,它是一款制作磁带备份的工具。我们经常看到扩展名为.tar或者.tgz的文件,它们各自表示普通的tar包和被gzip程序压缩过的tar包,一个tar包可以由一组独立的文件,一个或多个目录,或者两者混合体组成。命令语法如下:
tar mode[options] pathname…

这里的mode是指以下操作模式之一:
tar模式

模式含义
c为文件和/或目录列表创建归档文件
x抽取归档文件
r追加具体的路径到归档文件的末尾
t列出归档文件的内容
[me@linuxbox ~]$ mkdir -p playground/dir-{00{1..9},0{10..99},100}
[me@linuxbox ~]$ touch playground/dir-{00{1..9},0{10..99},100}/file-{A..Z}
[me@linuxbox ~]$ tar cf playground.tar playground
#这个命令创建了一个名为 playground.tar 的 tar 包,其包含整个 playground 目录层次结果。
#我们 可以看到模式 c 和选项 f,其被用来指定这个 tar 包的名字,模式和选项可以写在一起,而且不 需要开头的短横线。
#注意,然而,必须首先指定模式,然后才是其它的选项。

#要想列出归档文件的内容,我们可以这样做:
[me@linuxbox ~]$ tar tf playground.tar

#为了得到更详细的列表信息,我们可以添加选项v:
[me@linuxbox ~]$ tar tvf playground.tar

#现在,抽取 tar 包 playground 到一个新位置。
#我们先创建一个名为 foo 的新目录,更改目录, 然后抽取 tar 包中的文件:
[me@linuxbox ~]$ mkdir foo
[me@linuxbox ~]$ cd foo
[me@linuxbox ~]$ tar xf ../playground.tar
[me@linuxbox ~]$ ls
playground
#这里有一个警告,除非你是超级用户,要不然从归档文件中抽取的文件和目录的所有权由执行此复原操作的用户所拥有,而不属于原始所有者。

tar命令另一个有趣的行为是它处理归档文件路径名的方式。默认情况下,路径名是相对的,而不是绝对路径。当以相对路径创建归档文件的时候,tar命令会简单删除路径名开头的斜杠。

[me@linuxbox foo]$ cd
[me@linuxbox ~]$ tar cf playground2.tar ~/playground
[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ tar xf ../playground2.tar
[me@linuxbox foo]$ ls
home     playground
[me@linuxbox foo]$ ls home
me
[me@linuxbox foo]$ ls home/me
playground

~/playground 会展开成/home/me/playground,所以我们将会得到一个绝对路径名。这里我们看到当我们抽取第二个归档文件时,它重新创建了home/me/playground目录,相对于我们当前工作目录~/foo,而不是相对于root目录。

当抽取一个归档文件时,可以限制从归档文件中抽取什么内容:
tar xf archive.tar pathname
通过给命令添加末尾的路径名,tar命令就只会恢复指定的文件,可以指定多个路径名。注意 路径名必须是完全的,精准的相对路径名,就如存储在归档文件中的一样。当指定路径名的时候, 通常不支持通配符;然而,GNU 版本的 tar 命令(在 Linux 发行版中最常出现)通过 --wildcards 选项来 支持通配符。

[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ tar xf ../playground2.tar --wildcards 'home/me/playground/dir-\*/file-A'

tar 命令经常结合 find 命令一起来制作归档文件。在这个例子里,我们将会使用 find 命令来 产生一个文件集合,然后这些文件被包含到归档文件中。

[me@linuxbox ~]$ find playground -name 'file-A' -exec tar rf playground.tar '{}' '+'

这里我们使用 find 命令来匹配 playground 目录中所有名为 file-A 的文件,然后使用-exec 行为,来 唤醒带有追加模式(r)的 tar 命令,把匹配的文件添加到归档文件 playground.tar 里面。

tar命令也可以利用标准输出和输入:

[me@linuxbox foo]$ cd
[me@linuxbox ~]$ find playground -name 'file-A' | tar cf - --files-from=-
   | gzip > playground.tgz

在这个例子里面,我们使用 find 程序产生了一个匹配文件列表,然后把它们管道到 tar 命令中。 如果指定了文件名“-”,则其被看作是标准输入或输出,正是所需(顺便说一下,使用“-”来表示 标准输入/输出的惯例,也被大量的其它程序使用)。这个 --file-from 选项(也可以用 -T 来指定) 导致 tar 命令从一个文件而不是命令行来读入它的路径名列表。最后,这个由 tar 命令产生的归档 文件被管道到 gzip 命令中,然后创建了压缩归档文件 playground.tgz。此 .tgz 扩展名是命名 由 gzip 压缩的 tar 文件的常规扩展名。有时候也会使用 .tar.gz 这个扩展名。

虽然我们使用 gzip 程序来制作我们的压缩归档文件,但是现在的 GUN 版本的 tar 命令 ,gzip 和 bzip2 压缩两者都直接支持,各自使用 z 和 j 选项。以我们之前的例子为基础, 我们可以这样简化它:
[me@linuxbox ~]$ find playground -name ‘file-A’ | tar czf playground.tgz -T -
[me@linuxbox ~]$ find playground -name ‘file-A’ | tar cjf playground.tbz -T -

  1. zip

这个zip程序既是压缩工具,也是一个打包工具。在 Linux 中 gzip 是主要的压缩程序,而 bzip2则位居第二。
zip options zipfile file…
[me@linuxbox ~]$ zip -r playground.zip playground
除非我们包含-r 选项,要不然只有 playground 目录(没有任何它的内容)被存储。虽然会自动添加 .zip 扩展名,但为了清晰起见,我们还是包含文件扩展名。
使用 unzip 程序,来直接抽取一个 zip 文件的内容。
[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ unzip …/playground.zip

对于 zip 命令(与 tar 命令相反)要注意一点,就是如果指定了一个已经存在的文件包,其被更新 而不是被替代。这意味着会保留此文件包,但是会添加新文件,同时替换匹配的文件。可以列出 文件或者有选择地从一个 zip 文件包中抽取文件,只要给 unzip 命令指定文件名:

[me@linuxbox ~]$ unzip -l playground.zip playground/dir-87/file-Z
Archive: ../playground.zip
    Length      Date    Time    Name

         0    10-05-08  09:25   playground/dir-87/file-Z

         0                      1 file
[me@linuxbox ~]$ cd foo
[me@linuxbox foo]$ unzip ./playground.zip playground/dir-87/file-Z
Archive: ../playground.zip
replace playground/dir-87/file-Z? [y]es, [n]o, [A]ll, [N]one,
[r]ename: y
extracting: playground/dir-87/file-Z

使用-l选项,导致unzip命令指示列出文件包中的内容而没有抽取文件。

像 tar 命令一样,zip 命令能够利用标准输入和输出,虽然它的实施不大有用。通过-@选项,有可能把一系列的 文件名管道到 zip 命令。

[me@linuxbox foo]$ cd
[me@linuxbox ~]$ find playground -name "file-A" | zip -@ file-A.zip

这里我们使用 find 命令产生一系列与“file-A”相匹配的文件列表,并且把此列表管道到 zip 命令, 然后创建包含所选文件的文件包 file-A.zip。
zip 命令可以接受标准输入,所以它可以被用来压缩其它程序的输出:

[me@linuxbox ~]$ ls -l /etc/ | zip ls-etc.zip -
adding: - (deflated 80%)

在这个例子里,我们把 ls 命令的输出管道到 zip 命令。像 tar 命令,zip 命令把末尾的横杠解释为 “使用标准输入作为输入文件。”
tar和gzip程序在Linux系统中更受欢迎。

  1. 同步文件和目录

维护系统备份的常见策略是保持一个或多个目录与另一个本地系统(通常是某种可移动的存储设备) 或者远端系统中的目录(或多个目录)同步。能完成此任务且受人们喜爱的工具是rsync,这个程序能同步本地与远端目录,通过使用rsync远端更新协议,此协议允许rsync快速地检测两个目录的差异,执行最小量的复制来达到目录间的同步。
rsync options source destination
这里source和destination的取值如下:

  1. 一个本地文件或目录
  2. 一个远端文件或目录,以[user@]host:path 的形式存在
  3. 一个远端 rsync 服务器,由 rsync://[user@]host[:port]/path 指定

注意 source 和 destination 两者之一必须是本地文件。rsync 不支持远端到远端的复制

[me@linuxbox ~]$ rsync -av playground foo

我们包括了-a 选项(递归和保护文件属性)和-v 选项(冗余输出), 来在 foo 目录中制作一个 playground 目录的镜像。当这个命令执行的时候, 我们将会看到一系列的文件和目录被复制。在最后,我们将看到一条像这样的总结信息:

sent 135759 bytes received 57870 bytes 387258.00 bytes/sec
total size is 3230 speedup is 0.02

说明复制的数量。如果我们再次运行这个命令,我们将会看到不同的结果:

[me@linuxbox ~]$ rsync -av playgound foo
building file list ... done
sent 22635 bytes received 20 bytes
total size is 3230 speedup is 0.14
45310.00 bytes/sec

注意到没有文件列表。这是因为 rsync 程序检测到在目录~/playground 和 ~/foo/playground 之间 不存在差异,因此它不需要复制任何数据。

作为一个实际的例子, 让我们考虑一个假想的外部硬盘,之前我们在 tar 命令中用到过的。如果我们再次把此 硬盘连接到我们的系统中,它被挂载到/media/BigDisk 目录下,我们可以执行一个有 用的系统备份了,首先在外部硬盘上创建一个目录,名为/backup,然后使用 rsync 程序 从我们的系统中复制最重要的数据到此外部硬盘上:

[me@linuxbox ~]$ mkdir /media/BigDisk/backup
[me@linuxbox ~]$ sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup

在这个例子里,我们把/etc,/home,和/usr/local 目录从我们的系统中复制到假想的存储设备中。 我们包含了–delete 这个选项,来删除可能在备份设备中已经存在但却不再存在于源设备中的文件, (这与我们第一次创建备份无关,但是会在随后的复制操作中有用途)。挂载外部驱动器,运行 rsync 命令,不断重复这个过程,是一个不错的(虽然不理想)方式来保存少量的系统备份文件。

  1. 在网络间使用 rsync 命令
    rsync 程序的真正好处之一,是它可以被用来在网络间复制文件。毕竟,rsync 中的“r”象征着“remote”。 远程复制可以通过两种方法完成。第一个方法要求另一个系统已经安装了 rsync 程序,还安装了 远程 shell 程序,比如 ssh。比方说我们本地网络中的一个系统有大量可用的硬盘空间,我们想要 用远程系统来代替一个外部驱动器,来执行文件备份操作。假定远程系统中有一个名为/backup 的目录, 其用来存放我们传送的文件,我们这样做:
[me@linuxbox ~]$ sudo rsync -av --delete --rsh=ssh /etc /home /usr/local remote-sys:/backup

我们对命令做了两处修改,来方便网络间文件复制。首先,我们添加了–rsh=ssh 选项,其指示 rsync 使用 ssh 程序作为它的远程 shell。以这种方式,我们就能够使用一个 ssh 加密通道,把数据 安全地传送到远程主机中。其次,通过在目标路径名前加上远端主机的名字(在这种情况下, 远端主机名为 remote-sys),来指定远端主机。

rsync 可以被用来在网络间同步文件的第二种方式是通过使用 rsync 服务器。rsync 可以被配置为一个 守护进程,监听即将到来的同步请求。这样做经常是为了进行一个远程系统的镜像操作。例如,Red Hat 软件中心为它的 Fedora 发行版,维护着一个巨大的正在开发中的软件包的仓库。对于软件测试人员, 在发行周期的测试阶段,定期镜像这些软件集合是非常有帮助的。因为仓库中的这些文件会频繁地 (通常每天不止一次)改动,定期同步本地镜像而不是大量地拷贝软件仓库,这是更为明智的。 这些软件库之一被维护在乔治亚理工大学;我们可以使用本地 rsync 程序和它们的 rsync 服务器来镜像它。
[me@linuxbox ~]$ mkdir fedora-devel
[me@linuxbox ~]$ rsync -av -delete rsync://rsync.gtlib.gatech.edu/fedora-linux-
core/development/i386/os fedora-devel
在这个例子里,我们使用了远端 rsync 服务器的 URI,其由协议(rsync://),远端主机名 (rsync.gtlib.gatech.edu),和软件仓库的路径名组成。


6. 正则表达式

正则表达式是一种符号表示法,被用来识别文本模式。

1. grep

grep程序会在文本文件中查找一个指定的正则表达式,并把匹配行输出到标准输出。
grep [options] regex [file…]

grep选项

选项长选项描述含义
-i–ignore-case忽略大小写
-v–invert-match打印不包含匹配的行,也就是不匹配的文本行
-c–count打印匹配的数量
-l–files-with-matchs打印包含匹配项的文件名,而不是文本行本身
-L–files-without-match只打印不包含匹配项的文件名
-n–lines-number在每个匹配行之前打印出其位于文件中的相应行数
-h–no-filename应用于多文件搜索,不输出文件名
[me@linuxbox ~]$ ls /bin > dirlist-bin.txt
[me@linuxbox ~]$ ls /usr/bin > dirlist-usr-bin.txt
[me@linuxbox ~]$ ls /sbin > dirlist-sbin.txt
[me@linuxbox ~]$ ls /usr/sbin > dirlist-usr-sbin.txt
[me@linuxbox ~]$ ls dirlist*.txt
dirlist-bin.txt     dirlist-sbin.txt    dirlist-usr-sbin.txt
dirlist-usr-bin.txt

[me@linuxbox ~]$ grep -L bzip dirlist*.txt
dirlist-sbin.txt
dirlist-usr-bin.txt
dirlist-usr-sbin.txt

2. 元字符和原义字符

正则表达式元字符由以下字符组成:

^ $ . [ ] { } - ? * + ( ) | \

其他所有字符都被认为是原义字符。在个别情况下,反斜杠会被用来创建元序列,元字符也可以被转义为原义字符,而不是被解释为元字符。

注意:当shell执行展开的时候,许多正则表达式元字符,也是对shell有特殊含义的字符。当我们在命令行中传递包含元字符的正则表达式的时候,把元字符用引号引起来至关重要,这样可以阻止shell试图展开它们。

  1. 任何字符

原点符号会被看成是任意字符。

  1. 锚点

在正则表达式中,插入符号和美元符号被看作是锚点,这意味着正则表达式只有在文本行的开头或末尾被找到时,才算发生一次匹配。

  1. 中括号表达式和字符类

通过使用中括号表达式,我们也能够从一个指定的字符集合中匹配单个字符。一个字符集合可能包含任意多个字符,并且元字符被放置到中括号里面后就会失去它们的特殊含义。然而,在两种情况下,会在中括号表达式中使用元字符,并且有着不同的含义。第一个元字符是插入字符(^),其被用来表示否定;第二个是连字符字符(-),其被用来表示一个字符范围。

  1. 否定

如果在中括号表示式中的第一个字符是插入字符(^),则剩余的字符被看作是不会在给定的字符位置出现字符集合。

  1. POSIX字符集
#ASCII系统的排序规则像这样:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
#不同于正常的字典顺序规则:
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
#所以使用连字符就不一定得到想要的结果

POSIX字符集

字符集含义
[:alnum:]字母数字字符
[:word:]字母数字字符加下划线
[:alpha:]字母字符
[:blank:]包含空格和tab字符
[:cntrl:]ASCII的控制码
[:digit:]数字0到9
[:graph:]可视字符
[:lower:]小写字符
[:punct:]标点符号字符。等价于:[-!"#$%&’()*+,./:;<=>?@[\]_`{
[:print:]可打印字符。可视字符加空格字符
[:space:]空白字符,包括空格、tab、回车、换行、vertical tab 和 form feed.在 ASCII 中, 等价于:[ \t\r\n\v\f]
[:upper:]大写字母
[:xdigit:]用来表示十六进制数字的字符
[me@linuxbox ~]$ ls /usr/sbin/[[:upper:]]*
/usr/sbin/MAKEFLOPPIES
/usr/sbin/NetworkManagerDispatcher
/usr/sbin/NetworkManager

然而这不是一个正则表达式的例子,而是shell正在执行路径名展开操作。POSIX 规范的字符集适用于二者。


恢复到传统的排列顺序

通过改变环境变量 LANG 的值,你可以选择让你的系统使用传统的(ASCII)排列规则。如上所示,这个 LANG 变量包含了语种和字符集。这个值最初由你安装 Linux 系统时所选择的安装语言决定。
使用 locale 命令,来查看 locale 的设置。

 [me@linuxbox ~]$ locale
 LANG=en_US.UTF-8
 LC_CTYPE="en_US.UTF-8"
 LC_NUMERIC="en_US.UTF-8"
 LC_TIME="en_US.UTF-8"
 LC_COLLATE="en_US.UTF-8"
 LC_MONETARY="en_US.UTF-8"
 LC_MESSAGES="en_US.UTF-8"
 LC_PAPER="en_US.UTF-8"
 LC_NAME="en_US.UTF-8"
 LC_ADDRESS="en_US.UTF-8"
 LC_TELEPHONE="en_US.UTF-8"
 LC_MEASUREMENT="en_US.UTF-8"
 LC_IDENTIFICATION="en_US.UTF-8"
 LC_ALL=

把这个LANG变量设置为POSIX,来更改locale,使其使用传统的Unix行为。

[me@linuxbox ~]$ export LANG=POSIX
#注意这个改动使系统为它的字符集使用 U.S.英语(更准确地说,ASCII),所以要确认一下这 是否是你真正想要的效果。
#通过把这条语句添加到你的.bashrc 文件中,你可以使这个更改永久有效。
export LANG=POSIX

  1. POSIX基本正则表达式与POSIX扩展正则表达式

POSIX把正则表达式的实现分成了两类,基本正则表达式(BRE)和扩展正则表达式(ERE),既服从POSIX规范又实现了BRE的任意应用程序,都支持目前的所有正则表达式特性。我们的grep程序就是其中一个。

#关于元字符的问题。
#BRE可以辨别以下元字符:
^ $ . [ ] *
#其他的所有字符被认为是文本字符,ERE添加了以下元字符:
( ) { } ? + |

在 BRE 中,字符“(”,“)”,“{”,和 “}”用反斜杠转义后,被看作是元字符, 相反在 ERE 中,在任意元字符之前加上反斜杠会导致其被看作是一个文本字符。

因为我们将要讨论的下一个特性是 ERE 的一部分,我们将要使用一个不同的 grep 程序。照惯例, 一直由 egrep 程序来执行这项操作,但是 GNU 版本的 grep 程序在使用了-E 选项之后也支持扩展的正则表达式。


POSIX

在上世纪 80 年代中叶,IEEE 开始制定一套标准, 其将会定义 Unix 系统( 以及类 Unix 的系统 )如何执行。这些标准,正式成为 IEEE 1003, 定义了应用程序编程接口( APIs ),shell 和一些实用程序,其将会在标准的类 Unix 操作系统中找到。“POSIX” 这个名字,象征着可移植的操作系统接口(为了时髦一点,添加了末尾的 “X” ), 是由 Richard Stallman 建议的( 是的,的确是 Richard Stallman ),后来被 IEEE 采纳。


  1. 交替

扩展表达式的第一个特性叫做alternation(交替),其是一款允许从一系列表达式之间选择匹配项的实用程序。

#添加alternation,以竖杠线元字符为标记:
[me@linuxbox ~]$ echo "AAA" | grep -E 'AAA|BBB'
AAA
[me@linuxbox ~]$ echo "BBB" | grep -E 'AAA|BBB'
BBB
[me@linuxbox ~]$ echo "CCC" | grep -E 'AAA|BBB'
[me@linuxbox ~]$

为了把alternation和其他正则表达式元素结合起来,我们可以使用()来分离alternation

[me@linuxbox ~]$ grep -Eh '^(bz|gz|zip)' dirlist*.txt

这个表达式将会在我们的列表中匹配以“bz”,或“gz”,或“zip”开头的文件名。

  1. 限定符
    扩展正则表达式支持几种方法,来指定一个元素被匹配的次数。

? - 匹配零个或一个元素

比如说要查看一个电话号码的真实性,如果他匹配下面两种格式的任意一种,我们就认为这个号码是真实的:

(nnn) nnn-nnnn

nnn nnn-nnnn

则正则表达式为:

^\(?[0-9][0-9][0-9]\)?  [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

在这个表达式中,我们在圆括号之后加上一个问号,来表示它们将被匹配零次或一次。再一次,因为 通常圆括号都是元字符(在 ERE 中),所以我们在圆括号之前加上了反斜杠,使它们成为文本字符。

* - 匹配零个或多个元素

这个匹配的字符可以出现任意多次,不仅是一次

+ - 匹配一个或多个元素

前面的元素至少出现一次匹配

{} - 匹配特定个数的元素

{和}元字符都被用来表达要求匹配的最小和最大数目

指定匹配的数目

限定符含义
{n}如果前面的元素出现n次,则匹配它
{n,m}前面的元素至少出现了n次但不多余m次,则匹配前面的元素
{n,}前面的元素出现了不少于n次,则匹配它
{,m}前面的元素出现的次数不多余m次,则匹配它

用find查找丑陋的文件名

这个 find 命令支持一个基于正则表达式的测试。当在使用正则表达式方面比较 find 和 grep 命令的时候, 还有一个重要问题要牢记在心。当某一行包含的字符串匹配上了一个表达式的时候,grep 命令会打印出这一行, 然而 find 命令要求路径名精确地匹配这个正则表达式。在下面的例子里面,我们将使用带有一个正则 表达式的 find 命令,来查找每个路径名。

[me@linuxbox ~]$ find . -regex '.*[^-\_./0-9a-zA-Z].*'

由于要精确地匹配整个路径名,所以我们在表达式的两端使用了.*,来匹配零个或多个字符。 在表达式中间,我们使用了否定的中括号表达式,其包含了我们一系列可接受的路径名字符。

用locate查找文件

这个 locate 程序支持基本的(–regexp 选项)和扩展的(–regex 选项)正则表达式。通过 locate 命令,我们能够执行许多与先前操作 dirlist 文件时相同的操作:

[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)'
/bin/bzcat
/bin/bzcmp
/bin/bzdiff
/bin/bzegrep
/bin/bzexe
/bin/bzfgrep
/bin/bzgrep
/bin/bzip2
/bin/bzip2recover
/bin/bzless
/bin/bzmore
/bin/gzexe
/bin/gzip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit

用less和vim中查找文本

less 和 vim 两者享有相同的文本查找方法。按下/按键,然后输入正则表达式,来执行搜索任务。 如果我们使用 less 程序来浏览我们的 phonelist.txt 文件:

[me@linuxbox ~]$ less phonelist.txt

然后查找我们有效的表达式:

(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
~
~
~
/^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$

另一方面,vim支持基本的正则表达式,所有也可以使用:

/([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}

依赖于系统中vim的特殊配置,匹配项将会被高亮,如果不是,可以试试下面这个命令模式来激活搜索高亮功能:

:hlsearch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值