﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-MemoryGarden's Blog-随笔分类-Linux</title><link>http://www.cppblog.com/MemoryGarden/category/11770.html</link><description>努力

                                  -----------大能猫</description><language>zh-cn</language><lastBuildDate>Sun, 03 Jan 2010 19:31:10 GMT</lastBuildDate><pubDate>Sun, 03 Jan 2010 19:31:10 GMT</pubDate><ttl>60</ttl><item><title>crontab 命令的注意事项</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/12/31/104511.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 30 Dec 2009 17:17:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/12/31/104511.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/104511.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/12/31/104511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/104511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/104511.html</trackback:ping><description><![CDATA[今天搞了一个最基本的crontab 搞了我几个小时,把经验记录一下<br><br>crontab -l list crontab <br>crontab -r delete crontab<br><br>crontab -e 编辑<br><br><br>我在看到这些命令的时候很不high 因为很抽象, 反正主要就是要知道它是怎么搞的<br><br>大多都是定时指向一个shell脚本 <br><br>1 写好你的shell脚本一定要注意里面的路径的问题,我就是被它搞了几个小时,还有要把它搞成可执行的 就是chmod +x xxx.sh<br><br>2.1 随便建立一个文档 "&gt;xxxcron" 编辑 在网上到处都是得 crontab的命令 比如我写的&nbsp; 在1:11分的时候执行myshell.sh&nbsp;&nbsp;&nbsp; "11 1 * * * /home/xx/xx/myshell.sh" 这里记得要搞绝对路径,全路径. 保存后 "crontab xxxcron" 这样就加入了&nbsp; 如果查看可以 crontab -l <br><br>2.2 crontab -e 然后编译 如果不能编译的话, 去 搞 什么我忘记了...可以去查一下. 然后就写你的命令后保存就可以了. 查看和上面一样<br><br>3 crontab 最飘逸的地方是你如果想测试的话,要等,最简单的就是你写一个到几点几分的sh,随便搞一下, wc一个文件都可以,然后把输出定向到文件外面,这样来测试, 关键是如果有问题的话,crontab根本没有反应,所以我查了一下, 网上有说 "11 1 * * * /path/myshell.sh &gt; /xx/xx/xx/cron.log 2&gt;&amp;1" 这样就可以看到cron的错误了. 后来我找到我的错误就是sh文件里面的路径没有写绝对的路径...悲剧啊. <br><br><br>希望以上不伦不类的话能帮助跟我一样的不是很熟悉这个东西的人,有错误请指出 严重声明我是菜鸟.<br><br><br><br><br><br><img src ="http://www.cppblog.com/MemoryGarden/aggbug/104511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-12-31 01:17 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/12/31/104511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux mysql  (转)</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/17/96517.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Thu, 17 Sep 2009 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/17/96517.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96517.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/17/96517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96517.html</trackback:ping><description><![CDATA[转载连接 ： <a title="http://tieba.baidu.com/f?kz=177550427"  href="http://tieba.baidu.com/f?kz=177550427">http://tieba.baidu.com/f?kz=177550427</a><br><br>1&nbsp; 下载<br><br>下载地址为：<a  href="http://dev.mysql.com/downloads/mysql/5.0.html" target="_blank">http://dev.mysql.com/downloads/mysql/5.1.html</a><br><br>&nbsp;2、安装MySQL
<br>&nbsp;rpm文件是Red&nbsp;Hat公司开发的软件安装包，rpm可让Linux在安装软件包时免除许多复杂的手续。该命令在安装时常用的参数是&nbsp;&#8211;ivh&nbsp;,
其中i表示将安装指定的rmp软件包，V表示安装时的详细信息，h表示在安装期间出现&#8220;#&#8221;符号来显示目前的安装过程。这个符号将持续到安装完成后才停
止。<br>&nbsp;1）安装服务器端
<br>　　&nbsp;在有两个rmp文件的目录下运行如下命令：
<br>　　&nbsp;[root@test1&nbsp;local]#&nbsp;rpm&nbsp;-ivh&nbsp;MySQL-server-5.0.9-0.i386.rpm
<br>&nbsp;2）安装客户端
<br>　　&nbsp;运行如下命令：
<br>　　&nbsp;[root@test1&nbsp;local]#&nbsp;rpm&nbsp;-ivh&nbsp;MySQL-client-5.0.9-0.i386.rpm
<br>&nbsp;三、登录MySQL
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
[root@test1&nbsp;local]#&nbsp;mysql
<br>　　&nbsp;Welcome&nbsp;to&nbsp;the&nbsp;MySQL&nbsp;monitor.　Commands&nbsp;end&nbsp;with&nbsp;;&nbsp;or&nbsp;\g.
<br>　　&nbsp;Your&nbsp;MySQL&nbsp;connection&nbsp;id&nbsp;is&nbsp;1&nbsp;to&nbsp;server&nbsp;version:&nbsp;4.0.16-standard
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Type&nbsp;'help;'&nbsp;or&nbsp;'\h'&nbsp;for&nbsp;help.&nbsp;Type&nbsp;'\c'&nbsp;to&nbsp;clear&nbsp;the&nbsp;buffer.
<br>　　&nbsp;mysql&gt;
<br>　　&nbsp;出现了&#8220;mysql&gt;&#8221;提示符，恭喜你，安装成功！
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 增加了密码后的登录格式如下：
<br>　　&nbsp;mysql&nbsp;-u&nbsp;root&nbsp;-p
<br>　　&nbsp;Enter&nbsp;password:&nbsp;(输入密码)
<br>　　其中-u后跟的是用户名，-p要求输入密码，回车后在输入密码处输入密码。
<br><br><br>&nbsp;四、MySQL的几个重要目录
<br>
<br>　　&nbsp;MySQL安装完成后不象SQL&nbsp;Server默认安装在一个目录，它的数据库文件、配置文件和命令文件分别在不同的目录，了解这些目录非
常重要，尤其对于Linux的初学者，因为&nbsp;Linux本身的目录结构就比较复杂，如果搞不清楚MySQL的安装目录那就无从谈起深入学习。
<br>
<br>　　&nbsp;下面就介绍一下这几个目录。
<br>　　&nbsp;1、数据库目录
<br>　　&nbsp;/var/lib/mysql/
<br>
<br>　　&nbsp;2、配置文件
<br>　　&nbsp;/usr/share/mysql（mysql.server命令及配置文件）
<br>
<br>　　&nbsp;3、相关命令
<br>　　&nbsp;/usr/bin(mysqladmin&nbsp;mysqldump等命令)
<br>
<br>　　&nbsp;4、启动脚本
<br>　　&nbsp;/etc/rc.d/init.d/（启动脚本文件mysql的目录）
<br><br>　&nbsp;五、修改登录密码
<br>
<br>　　&nbsp;MySQL默认没有密码，安装完毕增加密码的重要性是不言而喻的。
<br>
<br>　　&nbsp;1、命令
<br>　　&nbsp;usr/bin/mysqladmin&nbsp;-u&nbsp;root&nbsp;password&nbsp;'new-password'
<br>　　&nbsp;格式：mysqladmin&nbsp;-u用户名&nbsp;-p旧密码&nbsp;password&nbsp;新密码
<br>
<br>　　&nbsp;2、例子
<br>　　&nbsp;例1：给root加个密码123456。
<br>　　&nbsp;键入以下命令&nbsp;：
<br>　　&nbsp;[root@test1&nbsp;local]#&nbsp;/usr/bin/mysqladmin&nbsp;-u&nbsp;root&nbsp;password&nbsp;123456
<br>　　注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。
<br>
<br>　　&nbsp;3、测试是否修改成功
<br>　　&nbsp;1）不用密码登录
<br>　　&nbsp;[root@test1&nbsp;local]#&nbsp;mysql
<br>　　&nbsp;ERROR&nbsp;1045:&nbsp;Access&nbsp;denied&nbsp;for&nbsp;user:&nbsp;'root@localhost'&nbsp;(Using&nbsp;password:&nbsp;NO)
<br>　　&nbsp;显示错误，说明密码已经修改。
<br>　　&nbsp;2）用修改后的密码登录
<br>　　&nbsp;[root@test1&nbsp;local]#&nbsp;mysql&nbsp;-u&nbsp;root&nbsp;-p
<br>　　&nbsp;Enter&nbsp;password:&nbsp;(输入修改后的密码123456)
<br>　　&nbsp;Welcome&nbsp;to&nbsp;the&nbsp;MySQL&nbsp;monitor.　Commands&nbsp;end&nbsp;with&nbsp;;&nbsp;or&nbsp;\g.
<br>　　&nbsp;Your&nbsp;MySQL&nbsp;connection&nbsp;id&nbsp;is&nbsp;4&nbsp;to&nbsp;server&nbsp;version:&nbsp;4.0.16-standard
<br>　　&nbsp;Type&nbsp;'help;'&nbsp;or&nbsp;'\h'&nbsp;for&nbsp;help.&nbsp;Type&nbsp;'\c'&nbsp;to&nbsp;clear&nbsp;the&nbsp;buffer.
<br>　　&nbsp;mysql&gt;
<br>　　&nbsp;成功！
<br>　　这是通过mysqladmin命令修改口令，也可通过修改库来更改口令。
<br>
<br><br>
<table bgcolor="#ffffff" border="0" width="72%">
    <tbody>
        <tr>
            <td align="left" width="97%">
            <table class="wr" border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr>
                        <td class="gray14"><cc>　&nbsp;六、启动与停止
                        <br>
                        <br>　　&nbsp;1、启动
                        <br>　　&nbsp;MySQL安装完成后启动文件mysql在/etc/init.d目录下，在需要启动时运行下面命令即可。
                        <br>　　&nbsp;[root@test1&nbsp;init.d]#&nbsp;/etc/init.d/mysql&nbsp;start
                        <br>
                        <br>　　&nbsp;2、停止
                        <br>　　&nbsp;/usr/bin/mysqladmin&nbsp;-u&nbsp;root&nbsp;-p&nbsp;shutdown
                        <br>
                        <br>　　&nbsp;3、自动启动
                        <br>　　&nbsp;1）察看mysql是否在自动启动列表中
                        <br>　　&nbsp;[root@test1&nbsp;local]#　/sbin/chkconfig&nbsp;&#8211;list
                        <br>　　&nbsp;2）把MySQL添加到你系统的启动服务组里面去
                        <br>　　&nbsp;[root@test1&nbsp;local]#　/sbin/chkconfig　&#8211;&nbsp;add　mysql
                        <br>　　&nbsp;3）把MySQL从启动服务组里面删除。
                        <br>　　&nbsp;[root@test1&nbsp;local]#　/sbin/chkconfig　&#8211;&nbsp;del　mysql
                        <br>七、更改MySQL目录
                        <br>
                        <br>　　&nbsp;MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步：
                        <br>
                        <br>　　&nbsp;1、home目录下建立data目录
                        <br>　　&nbsp;cd&nbsp;/home
                        <br>　　&nbsp;mkdir&nbsp;data
                        <br>
                        <br>　　&nbsp;2、把MySQL服务进程停掉：
                        <br>　　&nbsp;mysqladmin&nbsp;-u&nbsp;root&nbsp;-p&nbsp;shutdown
                        <br>
                        <br>　　&nbsp;3、把/var/lib/mysql整个目录移到/home/data
                        <br>　　&nbsp;mv&nbsp;/var/lib/mysql　/home/data/
                        <br>　　&nbsp;这样就把MySQL的数据文件移动到了/home/data/mysql下
                        <br>
                        <br>　　&nbsp;4、找到my.cnf配置文件
                        <br>　　如果/etc/目录下没有my.cnf配置文件，请到/usr/share/mysql/下找到*.cnf文件，拷贝其中一个到/etc/并改名为my.cnf)中。命令如下：
                        <br></cc>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td height="17"><br></td>
            <td class="p14">
            <br></td>
        </tr>
    </tbody>
</table>
&nbsp;[root@test1&nbsp;mysql]#&nbsp;cp&nbsp;/usr/share/mysql/my-medium.cnf　/etc/my.cnf
<br>
<br>　　&nbsp;5、编辑MySQL的配置文件/etc/my.cnf
<br>　　&nbsp;为保证MySQL能够正常工作，需要指明mysql.sock文件的产生位置。修改socket=/var/lib/mysql/mysql.sock一行中等号右边的值为：/home/mysql/mysql.sock&nbsp;。操作如下：
<br>　　&nbsp;vi　&nbsp;my.cnf　　　&nbsp;(用vi工具编辑my.cnf文件，找到下列数据修改之)
<br>　　&nbsp;#&nbsp;The&nbsp;MySQL&nbsp;server
<br>　　　&nbsp;[mysqld]
<br>　　　&nbsp;port　　　=&nbsp;3306
<br>　　　&nbsp;#socket　&nbsp;=&nbsp;/var/lib/mysql/mysql.sock（原内容，为了更稳妥用&#8220;#&#8221;注释此行）
<br>　　　&nbsp;socket　&nbsp;=&nbsp;/home/data/mysql/mysql.sock　　　（加上此行）
<br>
<br>　　&nbsp;6、修改MySQL启动脚本/etc/rc.d/init.d/mysql
<br>　　最后，需要修改MySQL启动脚本/etc/rc.d/init.d/mysql，把其中datadir=/var/lib/mysql一行中，等号右边的路径改成你现在的实际存放路径：home/data/mysql。
<br>　　&nbsp;[root@test1&nbsp;etc]#&nbsp;vi　/etc/rc.d/init.d/mysql
<br>　　&nbsp;#datadir=/var/lib/mysql　　　　（注释此行）
<br>　　&nbsp;datadir=/home/data/mysql　　&nbsp;（加上此行）
<br>
<br>　　&nbsp;7、重新启动MySQL服务
<br>　　&nbsp;/etc/rc.d/init.d/mysql　start
<br>　　&nbsp;或用reboot命令重启Linux
<br>　　&nbsp;如果工作正常移动就成功了，否则对照前面的7步再检查一下。
<br>
<br>　　&nbsp;八、MySQL的常用操作
<br>
<br>　　&nbsp;注意：MySQL中每个命令后都要以分号；结尾。
<br>
<br>　　&nbsp;1、显示数据库
<br>　　&nbsp;mysql&gt;&nbsp;show&nbsp;databases;
<br>　　&nbsp;+----------+
<br>　　&nbsp;|&nbsp;Database&nbsp;|
<br>　　&nbsp;+----------+
<br>　　&nbsp;|&nbsp;mysql　　|
<br>　　&nbsp;|&nbsp;test　　&nbsp;|
<br>　　&nbsp;+----------+
<br>　　&nbsp;2&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.04&nbsp;sec)
<br>　　&nbsp;Mysql刚安装完有两个数据库：mysql和test。mysql库非常重要，它里面有MySQL的系统信息，我们改密码和新增用户，实际上就是用这个库中的相关表进行操作。
<br>
<br>　　&nbsp;2、显示数据库中的表
<br>　　&nbsp;mysql&gt;&nbsp;use&nbsp;mysql;&nbsp;（打开库，对每个库进行操作就要打开此库，类似于foxpro&nbsp;）
<br>　　&nbsp;Database&nbsp;changed
<br>
<br>　　&nbsp;mysql&gt;&nbsp;show&nbsp;tables;
<br>　　&nbsp;+-----------------+
<br>　　&nbsp;|&nbsp;Tables_in_mysql&nbsp;|
<br>　　&nbsp;+-----------------+
<br>　　&nbsp;|&nbsp;columns_priv　　|
<br>　　&nbsp;|&nbsp;db　　　　　　　|
<br>　　&nbsp;|&nbsp;func　　　　　　|
<br>　　&nbsp;|&nbsp;host　　　　　　|
<br>　　&nbsp;|&nbsp;tables_priv　　&nbsp;|
<br>　　&nbsp;|&nbsp;user　　　　　　|
<br>　　&nbsp;+-----------------+
<br>　　&nbsp;6&nbsp;rows&nbsp;in&nbsp;set&nbsp;(0.01&nbsp;sec)
<br>
<br>　　&nbsp;3、显示数据表的结构：
<br>　　&nbsp;describe&nbsp;表名;
<br>
<br>　　&nbsp;4、显示表中的记录：
<br>　　&nbsp;select&nbsp;*&nbsp;from&nbsp;表名;
<br>　　例如：显示mysql库中user表中的纪录。所有能对MySQL用户操作的用户都在此表中。
<br>　　&nbsp;Select&nbsp;*&nbsp;from&nbsp;user;
<br>
<br>　　&nbsp;5、建库：
<br>　　&nbsp;create&nbsp;database&nbsp;库名;
<br>　　&nbsp;例如：创建一个名字位aaa的库
<br>　　&nbsp;mysql&gt;&nbsp;create&nbsp;databases&nbsp;aaa;
<br>6、建表：
<br>　　&nbsp;use&nbsp;库名；
<br>　　&nbsp;create&nbsp;table&nbsp;表名&nbsp;(字段设定列表)；
<br>　　例如：在刚创建的aaa库中建立表name,表中有id(序号，自动增长)，xm（姓名）,xb（性别）,csny（出身年月）四个字段
<br>　　&nbsp;use&nbsp;aaa;
<br>　　&nbsp;mysql&gt;&nbsp;create&nbsp;table&nbsp;name&nbsp;(id&nbsp;int(3)&nbsp;auto_increment&nbsp;not&nbsp;null&nbsp;primary&nbsp;key,&nbsp;xm&nbsp;char(8),xb&nbsp;char(2),csny&nbsp;date);
<br>　　&nbsp;可以用describe命令察看刚建立的表结构。
<br>　　&nbsp;mysql&gt;&nbsp;describe&nbsp;name;
<br>
<br>　　&nbsp;+-------+---------+------+-----+---------+----------------+
<br>　　&nbsp;|&nbsp;Field&nbsp;|&nbsp;Type　　|&nbsp;Null&nbsp;|&nbsp;Key&nbsp;|&nbsp;Default&nbsp;|&nbsp;Extra　　　　　|
<br>　　&nbsp;+-------+---------+------+-----+---------+----------------+
<br>　　&nbsp;|&nbsp;id　　|&nbsp;int(3)　|　　　|&nbsp;PRI&nbsp;|&nbsp;NULL　　|&nbsp;auto_increment&nbsp;|
<br>　　&nbsp;|&nbsp;xm　　|&nbsp;char(8)&nbsp;|&nbsp;YES　|　　&nbsp;|&nbsp;NULL　　|　　　　　　　　|
<br>　　&nbsp;|&nbsp;xb　　|&nbsp;char(2)&nbsp;|&nbsp;YES　|　　&nbsp;|&nbsp;NULL　　|　　　　　　　　|
<br>　　&nbsp;|&nbsp;csny　|&nbsp;date　　|&nbsp;YES　|　　&nbsp;|&nbsp;NULL　　|　　　　　　　　|
<br>　　&nbsp;+-------+---------+------+-----+---------+----------------+
<br>
<br>　　&nbsp;7、增加记录
<br>　　&nbsp;例如：增加几条相关纪录。
<br>　　&nbsp;mysql&gt;&nbsp;insert&nbsp;into&nbsp;name&nbsp;values('','张三','男','1971-10-01');
<br>　　&nbsp;mysql&gt;&nbsp;insert&nbsp;into&nbsp;name&nbsp;values('','白云','女','1972-05-20');
<br>　　&nbsp;可用select命令来验证结果。
<br>　　&nbsp;mysql&gt;&nbsp;select&nbsp;*&nbsp;from&nbsp;name;
<br>　　&nbsp;+----+------+------+------------+
<br>　　&nbsp;|&nbsp;id&nbsp;|&nbsp;xm　&nbsp;|&nbsp;xb　&nbsp;|&nbsp;csny　　　&nbsp;|
<br>　　&nbsp;+----+------+------+------------+
<br>　　&nbsp;|　1&nbsp;|&nbsp;张三&nbsp;|&nbsp;男　&nbsp;|&nbsp;1971-10-01&nbsp;|
<br>　　&nbsp;|　2&nbsp;|&nbsp;白云&nbsp;|&nbsp;女　&nbsp;|&nbsp;1972-05-20&nbsp;|
<br>　　&nbsp;+----+------+------+------------+
<br>
<br>　　&nbsp;8、修改纪录
<br>　　&nbsp;例如：将张三的出生年月改为1971-01-10
<br>　　&nbsp;mysql&gt;&nbsp;update&nbsp;name&nbsp;set&nbsp;csny='1971-01-10'&nbsp;where&nbsp;xm='张三';
<br>
<br>　　&nbsp;9、删除纪录
<br>　　&nbsp;例如：删除张三的纪录。
<br>　　&nbsp;mysql&gt;&nbsp;delete&nbsp;from&nbsp;name&nbsp;where&nbsp;xm='张三';
<br>
<br>　　&nbsp;10、删库和删表
<br>　　&nbsp;drop&nbsp;database&nbsp;库名;
<br>　　&nbsp;drop&nbsp;table&nbsp;表名；
<br>
<br>　　&nbsp;九、增加MySQL用户
<br>
<br>　　&nbsp;格式：grant&nbsp;select&nbsp;on&nbsp;数据库.*&nbsp;to&nbsp;用户名@登录主机&nbsp;identified&nbsp;by&nbsp;"密码"
<br>例1、增加一个用户user_1密码为123，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MySQL，然后键入以下命令：
<br>
<br>　　&nbsp;mysql&gt;&nbsp;grant&nbsp;select,insert,update,delete&nbsp;on&nbsp;*.*&nbsp;to&nbsp;user_1@"%"&nbsp;Identified&nbsp;by&nbsp;"123";
<br>例1增加的用户是十分危险的，如果知道了user_1的密码，那么他就可以在网上的任何一台电脑上登录你的MySQL数据库并对你的数据为所欲为了，解决办法见例2。
<br>
<br>　　例2、增加一个用户user_2密码为123,让此用户只可以在localhost上登录，并可以对数据库aaa进行查询、插入、修改、删除
的操作（localhost指本地主机，即MySQL数据库所在的那台主机），这样用户即使用知道user_2的密码，他也无法从网上直接访问数据库，只
能通过&nbsp;MYSQL主机来操作aaa库。
<br>
<br>　　&nbsp;mysql&gt;grant&nbsp;select,insert,update,delete&nbsp;on&nbsp;aaa.*&nbsp;to&nbsp;user_2@localhost&nbsp;identified&nbsp;by&nbsp;"123";
<br>
<br>　　&nbsp;用新增的用户如果登录不了MySQL，在登录时用如下命令：
<br>
<br>　　&nbsp;mysql&nbsp;-u&nbsp;user_1&nbsp;-p　-h&nbsp;192.168.113.50　（-h后跟的是要登录主机的ip地址）
<br>
<br>　　&nbsp;十、备份与恢复
<br>
<br>　　&nbsp;1、备份
<br>
<br>　　&nbsp;例如：将上例创建的aaa库备份到文件back_aaa中
<br>
<br>　　&nbsp;[root@test1&nbsp;root]#&nbsp;cd　/home/data/mysql　(进入到库目录，本例库已由val/lib/mysql转到/home/data/mysql，见上述第七部分内容)
<br>　　&nbsp;[root@test1&nbsp;mysql]#&nbsp;mysqldump&nbsp;-u&nbsp;root&nbsp;-p&nbsp;--opt&nbsp;aaa&nbsp;&gt;&nbsp;back_aaa
<br>
<br>　　&nbsp;2、恢复
<br>
<br>　　&nbsp;[root@test&nbsp;mysql]#&nbsp;mysql&nbsp;-u&nbsp;root&nbsp;-p&nbsp;ccc&nbsp;&lt;&nbsp;back_aaa
<br><br><br><br><br><br><br><img src ="http://www.cppblog.com/MemoryGarden/aggbug/96517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-17 13:26 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/17/96517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第八章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96468.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 14:29:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96468.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96468.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96468.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96468.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp;&nbsp; 相信 g r e p是 U N I X和 L I N U X中使用最广泛的命令之一。 g r e p（全局正则表达式版本）允许<br>对文本文件进行模式查找。如果找到匹配模式， grep打印包含模式的所有行。 grep支持基本正<br>则表达式，也支持其扩展集。 grep有三种变形，即：<br>&nbsp;&nbsp; Grep：标准 grep命令，本章大部分篇幅集中讨论此格式。<br>&nbsp;&nbsp; E g r e p ：扩展 g r e p，支持基本及扩展的正则表达式，但不支持 \ q 模式范围的应用，与之相<br>对应的一些更加规范的模式，这里也不予讨论。<br>&nbsp;&nbsp; F g r e p：快速 g r e p 。允许查找字符串而不是一个模式。不要误解单词 f a s t，实际上它与 g r e p<br>速度相当。<br>&nbsp;&nbsp; 在本章中我们将讨论：<br>&nbsp;&nbsp; &#8226; grep（参数）选项。<br>&nbsp;&nbsp; &#8226; 匹配 grep的一般模式。<br>&nbsp;&nbsp; &#8226; 只匹配字母或数字，或两者混用。<br>&nbsp;&nbsp; &#8226; 匹配字符串范围。<br>&nbsp;&nbsp; 实际上应该只有一个 grep 命令，但不幸的是没有一种简单形式能够统一处理 grep的三种变<br>形，将之合而为一，并保持 g r e p 单模式处理时的速度。 GNU grep 虽然在融合三种变形上迈进<br>了一大步，但仍不能区分元字符的基本集和扩展集。上一章只讨论了基本的正则表达式，但<br>在查看 g r e p时也涉及到一些扩展模式的匹配操作。然而，首先还是先讨论一下在 g r e p 和 f g r e p<br>及egrep中均可使用的 grep模式吧。<br>&nbsp;&nbsp; 开始讨论之前，先生成一个文件，插入一段文本，并在每列后加入 &lt;Tab&gt;键， g r e p命令示<br>例中绝大多数将以此为例，其命名为 data..f。生成一个文件，但不知其含义，将是一件很枯燥<br>的事。那么先来看看 data.f的记录结构。<br>&nbsp;&nbsp; 第1列：城市位置编号。<br>&nbsp;&nbsp; 第2列：月份。<br>&nbsp;&nbsp; 第3列：存储代码及出库年份。<br>&nbsp;&nbsp; 第4列：产品代号。<br>&nbsp;&nbsp; 第5列：产品统一标价。<br>&nbsp;&nbsp; 第6列：标识号。<br>&nbsp;&nbsp; 第7列：合格数量。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 57<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp; 下载<br>8.1 grep<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grep一般格式为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grep [ 选项 ]基本正则表达式 [文件 ]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里基本正则表达式可为字符串。<br>8.1.1 双引号引用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在g r e p命令中输入字符串参数时，最好将其用双引号括起来。例如： m y s t r i n g&#8221;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。这样做<br>&nbsp;有两个原因，一是以防被误解为 s h e l l命令，二是可以用来查找多个单词组成的字符串，例如：<br>&#8220; jet plane &#8221; ，如果不用双引号将其括起来，那么单词 p l a n e 将被误认为是一个文件，查询结果<br>&nbsp;将返回&#8220;文件不存在&#8221;的错误信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在调用变量时，也应该使用双引号，诸如： g r e p&#8220; $MYVAR &#8221;文件名，如果不这样，将<br>&nbsp;没有返回结果。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在调用模式匹配时，应使用单引号。<br>&nbsp;8.1.2 grep选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常用的 grep选项有：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -c 只输出匹配行的计数。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -i 不区分大小写（只适用于单字符）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -h 查询多文件时不显示文件名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -l 查询多文件时只输出包含匹配字符的文件名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -n 显示匹配行及行号。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -s 不显示不存在或无匹配文本的错误信息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -v 显示不包含匹配文本的所有行。<br>&nbsp;8.1.3 查询多个文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果要在当前目录下所有 .doc文件中查找字符串&#8220; sort&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ grep "sort"*.doc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或在所有文件中查询单词&#8220; sort it &#8221;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ grep "sort it" *<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在讲述在文本文件中 grep选项的用法。<br>&nbsp;8.1.4 行匹配<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ grep -c "48"data.f<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; grep返回数字 4，意义是有 4行包含字符串&#8220; 48&#8221;。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在显示包含&#8220; 48&#8221;字符串的 4行文本：<br>&nbsp;&nbsp;&nbsp; 58&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp;8.1.5 行数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示满足匹配模式的所有行行数：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行数在输出第一列，后跟包含 48的每一匹配行。<br>&nbsp;8.1.6 显示非匹配行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示所有不包含 48的各行：<br>8.1.7 精确匹配<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可能大家已注意到，在上一例中，抽取字符串&#8220; 4 8 &#8221;&nbsp;&nbsp;&nbsp; ，返回结果包含诸如 4 8 4和4 8 3 等包含<br>&#8220; 48&#8221;的其他字符串，实际上应精确抽取只包含 48的各行。注意在每个匹配模式中抽取字符串<br>后有一个 &lt;Tab&gt;键，所以应操作如下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Tab&gt;表示点击 tab键。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用 g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加 \ &gt; 。假定现在精确抽取 4 8 ，<br>方法如下：<br>8.1.8 大小写敏感<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 缺省情况下， g r e p是大小写敏感的，如要查询大小写不敏感字符串，必须使用 - i开关。在<br>d a t a . f 文件中有月份字符 S e p t，既有大写也有小写，要取得此字符串大小写不敏感查询，方法<br>&nbsp;如下：<br>&nbsp;8.2 grep和正则表达式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用正则表达式使模式匹配加入一些规则，因此可以在抽取信息中加入更多选择。使用<br>正则表达式时最好用单引号括起来，这样可以防止 g r e p 中使用的专有模式与一些 s h e l l 命令的<br>特殊方式相混淆。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 59<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp;下载<br>8.2.1 模式范围<br>&nbsp;&nbsp;&nbsp;&nbsp; 假定要抽取代码为 484和483的城市位置，上一章中讲到可以使用 [] 来指定字符串范围，这<br>里用 48开始，以 3或4结尾，这样抽出 484或483。<br>8.2.2 不匹配行首<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要抽出记录，使其行首不是 48，可以在方括号中使用 ^记号，表明查询在行首开始。<br>8.2.3 设置大小写<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用 - i 开关可以屏蔽月份 S e p t的大小写敏感，也可以用另一种方式。这里使用 [ ]模式抽取<br>各行包含 Sept和sept的所有信息。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要抽取包含 S e p t 的所有月份，不管其大小写，并且此行包含字符串 4 8 3，可以使用管<br>道命令，即符号&#8220; |&#8221;左边命令的输出作为&#8220; |&#8221;右边命令的输入。举例如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 不必将文件名放在第二个 grep命令中，因为其输入信息来自于第一个 grep命令的输出。<br>8.2.4 匹配任意字符<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果抽取以 L开头，以 D 结尾的所有代码，可使用下述方法，因为已知代码长度为 5 个字<br>符：<br>&nbsp;&nbsp;&nbsp;&nbsp; 将上述代码做轻微改变，头两个是大写字母，中间两个任意，并以 C结尾：<br>8.2.5 日期查询<br>&nbsp;&nbsp;&nbsp;&nbsp; 一个常用的查询模式是日期查询。先查询所有以 5开始以 1 9 9 6 或1 9 9 8结尾的所有记录。使<br>用模式 5 . . 1 9 9 [ 6 , 8 ]。这意味着第一个字符为 5 ，后跟两个点，接着是 1 9 9 ，剩余两个数字是 6或<br>8。<br>&nbsp;&nbsp; 60&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp; 查询包含 1 9 9 8 的所有记录的另外一种方法是使用表达式 [ 0 - 9 ] \ { 3 \ } [ 8 ] ，含义是任意数字重<br>复3次，后跟数字 8，虽然这个方法不像上一个方法那么精确，但也有一定作用。<br>8.2.6 范围组合<br>&nbsp;&nbsp;&nbsp;&nbsp; 必须学会使用 []抽取信息。假定要取得城市代码，第一个字符为任意字符，第二个字符在<br>0到5之间，第三个字符在 0到6之间，使用下列模式即可实现。<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里返回很多信息，有想要的，也有不想要的。参照模式，返回结果是正确的，因此这<br>里还需要细化模式，可以以行首开始，使用 ^符号：<br>&nbsp;&nbsp;&nbsp;&nbsp; 这样可以返回一个预期的正确结果。<br>8.2.7 模式出现机率<br>&nbsp;&nbsp;&nbsp;&nbsp; 抽取包含数字 4至少重复出现两次的所有行，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 上述语法指明数字 4至少重复出现两次。<br>&nbsp;&nbsp;&nbsp;&nbsp; 同样，抽取记录使之包含数字 999（三个 9）&nbsp;&nbsp; ，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要查询重复出现次数一定的所有行，语法如下，数字 9重复出现两次：<br>&nbsp;&nbsp;&nbsp;&nbsp; 有时要查询重复出现次数在一定范围内，比如数字或字母重复出现 2 到6 次，下例匹配数<br>字8重复出现 2到6次，并以 3结尾：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 61<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp; 下载<br>8.2.8 使用grep匹配&#8220;与&#8221;或者&#8220;或&#8221;模式<br>&nbsp;&nbsp;&nbsp;&nbsp; g r e p 命令加 - E 参数，这一扩展允许使用扩展模式匹配。例如，要抽取城市代码为 2 1 9 或<br>216，方法如下：<br>8.2.9 空行<br>&nbsp;&nbsp;&nbsp;&nbsp; 结合使用 ^和$可查询空行。使用 -n 参数显示实际行数：<br>8.2.10 匹配特殊字符<br>&nbsp;&nbsp;&nbsp;&nbsp; 查询有特殊含义的字符，诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含&#8220;.&#8221;<br>的所有行，脚本如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 或者是一个双引号：<br>&nbsp;&nbsp;&nbsp;&nbsp; 以同样的方式，如要查询文件名 conftroll.conf（这是一个配置文件）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，脚本如下：<br>8.2.11 查询格式化文件名<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用正则表达式可匹配任意文件名。系统中对文本文件有其标准的命名格式。一般最多<br>六个小写字符，后跟句点，接着是两个大写字符。例如，要在一个包含各类文件名的文件<br>filename.deposit 中定位这类文件名，方法如下：<br>8.2.12 查询IP地址<br>&nbsp;&nbsp;&nbsp;&nbsp; 查询 D N S 服务是日常工作之一，这意味着要维护覆盖不同网络的大量 I P 地址。有时地址<br>I P 会超过 2 0 0 0个。如果要查看 n n n . n n n 网络地址，但是却忘了第二部分中的其余部分，只知有<br>两个句点，例如 nnn.nn..。要抽取其中所有 nnn.nnn IP 地址，使用 [0-9]\{3\}\.[0-0\{3\}\。含义是<br>任意数字出现 3次，后跟句点，接着是任意数字出现 3次，后跟句点。<br>&nbsp; 62&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>8.3 类名<br>&nbsp;&nbsp; grep允许使用国际字符模式匹配或匹配模式的类名形式。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表8-1 类名及其等价的正则表达式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等价的正则表达式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类&nbsp;&nbsp;&nbsp;&nbsp; 等价的正则表达式<br>&nbsp;&nbsp; [[:upper:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [A-Z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[:alnum:]]&nbsp; [0-9a-zA-Z]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空格或 tab键<br>&nbsp;&nbsp; [[:lower:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [a-z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[:space:]]<br>&nbsp;&nbsp; [[:digit:]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [0-9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[:alpha:]]&nbsp; [a-zA-Z]<br>&nbsp;&nbsp; 现举例说明其使用方式。要抽取产品代码，该代码以 5 开头，后跟至少两个大写字母。使<br>用的脚本如下：<br>&nbsp;&nbsp; 如果要抽取以 P或D 结尾的所有产品代码，方法如下：<br>使用通配符*的匹配模式<br>&nbsp;&nbsp; 现在讲述 grep中通配符 *的使用。现有文件如下：<br>&nbsp;&nbsp; 下述 grep模式结果显示如下：<br>&nbsp;&nbsp; 如在行尾查询某一单词，试如下模式：<br>&nbsp;&nbsp; 这将在所有文件中查询行尾包含单词 device的所有行。<br>8.4 系统grep命令<br>&nbsp;&nbsp; 使用已学过的知识可以很容易通过 g r e p 命令获得系统信息。下面几个例子中，将用到管<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 63<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp; 下载<br>道命令，即符号 |，使用它左边命令的输出结果作为它右边命令的输入。<br>8.4.1 目录<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要查询目录列表中的目录，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果在一个目录中查询不包含目录的所有文件，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 要查询其他用户和其他用户组成员有可执行权限的目录集合，方法如下：<br>8.4.2 passwd文件<br>上述脚本查询 /etc/passwd文件是否包含 louise字符串，如果误输入以下脚本：<br>将返回 grep命令错误代码 'No such file or directory' 。<br>&nbsp;&nbsp;&nbsp;&nbsp; 上述结果表明输入文件名不存在，使用 grep命令 -s开关，可屏蔽错误信息。<br>返回命令提示符，而没有文件不存在的错误提示。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果 grep命令不支持 -s开关，可替代使用以下命令：<br>脚本含义是匹配命令输出或错误（ 2 &gt; $ 1 ）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，并将结果输出到系统池。大多数系统管理员称<br>/dev/null为比特池，没关系，可以将之看成一个无底洞，有进没有出，永远也不会填满。<br>&nbsp;&nbsp;&nbsp;&nbsp; 上述两个例子并不算好，因为这里的目的只想知道查询是否成功。本书后面部分将讨论<br>grep命令的 exit用法，它允许查询并不成功返回。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如要保存 grep命令的查询结果，可将命令输出重定向到一个文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 脚本将输出重定向到目录 /tmp下文件 passwd.out中。<br>8.4.3 使用ps命令<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用带有 ps x 命令的 g r e p可查询系统上运行的进程。 ps x 命令意为显示系统上运行的所有<br>进程列表。要查看 DNS服务器是否正在运行（通常称为 named）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，方法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 输出也应包含此 g r e p 命令，因为 g r e p命令创建了相应进程， ps x 将找到它。在 g r e p命令中<br>使用 -v 选项可丢弃 ps命令中的 grep进程。<br>&nbsp;&nbsp; 64&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果 ps x 不适用于用户系统，替代使用 ps -ef。<br>8.4.4 对一个字符串使用grep<br>&nbsp;&nbsp;&nbsp;&nbsp; g r e p不只应用于文件，也可应用于字符串。为此使用 e c h o字符串命令，然后对 g r e p命令使<br>用管道输入。<br>匹配成功实现。<br>因为没有匹配字符串，所以没有输出结果。<br>8.5 egrep<br>&nbsp;&nbsp;&nbsp;&nbsp; e g r e p代表 e x p r e s s i o n或extended grep ，适情况而定。 e g r e p接受所有的正则表达式， e g r e p<br>的一个显著特性是可以以一个文件作为保存的字符串，然后将之传给 e g r e p作为参数，为此使<br>用-f开关。如果创建一个名为 grepstrings 的文件，并输入 484和47：<br>&nbsp;&nbsp;&nbsp;&nbsp; 上述脚本匹配 d a t a . f中包含 4 8 4或 4 7的所有记录。当匹配大量模式时， - f开关很有用，而在<br>一个命令行中敲入这些模式显然极为繁琐。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要查询存储代码 32L或2CC，可以使用（ |）符号，意即&#8220; |&#8221;符号两边之一或全部。<br>&nbsp;&nbsp;&nbsp;&nbsp; 可以使用任意多竖线符&#8220; | &#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，例如要查看在系统中是否有帐号 l o u i s e 、 m a t t y 或 pauline ，<br>使用 who命令并管道输出至 egrep。<br>&nbsp;&nbsp;&nbsp;&nbsp; 还可以使用 ^ 符号排除字符串。如果要查看系统上的用户，但不包括 m a t t y 和 p a u l i n e ，方<br>法如下：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果要查询一个文件列表，包括 s h u t d o w n、s h u t d o w n s、 r e b o o t和r e b o o t s ，使用 e g r e p可容<br>易地实现。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第8章 grep 家 族<br>&nbsp;下载<br>8.6 小结<br>&nbsp;&nbsp; 希望大家已经理解了 g r e p的灵活性，它是一个很强大而流行的工具，像其他许多 U N I X工<br>具一样，已经被使用在 D O S 中。如果要通过文件快速查找字符串或模式， g r e p 是一个很好的<br>选择。简单地说， g r e p是s h e l l 编程中很重要的工具，在本书后面部分使用其他 U N I X工具和进<br>行变量替换时将发现这一点。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 22:29 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第七章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96461.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 13:09:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96461.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96461.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96461.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96461.html</trackback:ping><description><![CDATA[&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第7章 正则表达式介绍<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 随着对 UNIX和LINUX熟悉程度的不断加深，需要经常接触到正则表达式这个领域。使用<br>s h e l l 时，从一个文件中抽取多于一个字符串将会很麻烦。例如，在一个文本中抽取一个词，<br>它的头两个字符是大写的，后面紧跟四个数字。如果不使用某种正则表达式，在 s h e l l 中将不<br>能实现这个操作。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本章内容包括：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 匹配行首与行尾。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 匹配数据集。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 只匹配字母和数字。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 匹配一定范围内的字符串集。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当从一个文件或命令输出中抽取或过滤文本时，可以使用正则表达式（ RE）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，正则表达式<br>是一些特殊或不很特殊的字符串模式的集合。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了抽取或获得信息，我们给出抽取操作应遵守的一些规则。这些规则由一些特殊字符<br>或进行模式匹配操作时使用的元字符组成。也可以使用规则字符作为模式中的一部分进行搜<br>寻。例如， A将查询 A，x将查找字母 x。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统自带的所有大的文本过滤工具在某种模式下都支持正则表达式的使用，并且还包括<br>一些扩展的元字符集。这里只涉及其中之一，即以字符出现情况进行匹配的表达式，原因是<br>一些系统将这类模式划分为一组形成基本元字符的集合。这是一个好想法，本书也采用这种<br>方式。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本章设计的基本元字符使用在 grep和sed 命令中，同时结合 {\\}（以字符出现情况进行匹配<br>的元字符）使用在 awk语言中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表7-1 基本元字符集及其含义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只只匹配行首<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只只匹配行尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只一个单字符后紧跟 * ，匹配 0个或多个此单字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只匹配 [ ] 内字符。可以是一个单字符，也可以是字符序列。可以使用 -<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; []<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示 [] 内字符序列范围，如用 [1-5] 代替 [12345]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l 中一些元字符有<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 特殊含义。 \可以使其失去应有意义<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只匹配任意单字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只用来匹配前面 pattern 出现次数。 n 为次数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pattern\{n\}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pattern\{n， \}m&nbsp; 只含义同上，但次数最少为 n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pattern\{n， m\}&nbsp; 只含义同上，但 pattern 出现次数在 n 与 m之间<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在详细讲解其中特殊含义。<br>&nbsp; 50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>7.1 使用句点匹配单字符<br>&nbsp;&nbsp; 句点&#8220; .&#8221;可以匹配任意单字符。例如，如果要匹配一个字符串，以 beg开头，中间夹一个<br>任意字符，那么可以表示为 beg.n ， .&#8221;可以匹配字符串头，也可以是中间任意字符。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;<br>&nbsp;&nbsp; 在ls -l 命令中，可以匹配一定权限：<br>&nbsp;&nbsp; ...x..x..x<br>&nbsp;&nbsp; 此格式匹配用户本身，用户组及其他组成员的执行权限。<br>&nbsp;&nbsp; 假定正在过滤一个文本文件，对于一个有 1 0个字符的脚本集，要求前 4个字符之后为 X C ，<br>匹配操作如下：<br>&nbsp;&nbsp; . . . .X C. . . .<br>&nbsp;&nbsp; 以上例子解释为前 4个字符任意， 5，6字符为 XC，后 4个字符也任意，按下例运行：<br>&nbsp;&nbsp; 注意，&nbsp;&nbsp;&nbsp;&nbsp; &#8220;．&#8221;允许匹配 ASCII集中任意字符，或为字母，或为数字。<br>7.2 在行首以^匹配字符串或字符序列<br>&nbsp;&nbsp; ^只允许在一行的开始匹配字符或单词。例如，使用 ls -l 命令，并匹配目录。之所以可以<br>这样做是因为 ls -l 命令结果每行第一个字符是 d，即代表一个目录。<br>&nbsp;&nbsp; 回到脚本（ 1）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，使用 ^001，结果将匹配每行开始为 001的字符串或单词：<br>&nbsp;&nbsp; 可以将各种模式结合使用，例如：<br>&nbsp;&nbsp; ^...4XC....<br>&nbsp;&nbsp; 结果为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 51<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第7章 正则表达式介绍<br>&nbsp;下载<br>&nbsp;&nbsp; 以上模式表示，在每行开始，匹配任意 3个字符，后跟 4 X C，最后为任意 4个字符。 ^ 在正<br>则表达式中使用频繁，因为大量的抽取操作通常在行首。<br>&nbsp;&nbsp; 在行首第 4个字符为 1，匹配操作表示为：<br>&nbsp;&nbsp; ^...1<br>&nbsp;&nbsp; 结果为：<br>&nbsp;&nbsp; 行首前 4个字符为 comp，匹配操作表示为：<br>&nbsp;&nbsp; ^comp<br>&nbsp;&nbsp; 假定重新定义匹配模式，行首前 4个字符为 c o m p，后面紧跟两个任意字符，并以 i n g 结尾，<br>一种方法为：<br>&nbsp;&nbsp; ^comp..ing<br>&nbsp;&nbsp; 以上例子太明显了，不是很有用，但仍讲述了混合使用正则模式的基本概念。<br>7.3 在行尾以$匹配字符串或字符<br>&nbsp;&nbsp; 可以说 $与^正相反，它在行尾匹配字符串或字符， $符号放在匹配单词后。假定要匹配以<br>单词 trouble 结尾的所有行，操作为：<br>&nbsp;&nbsp; trouble$<br>&nbsp;&nbsp; 类似的，使用 1d$返回每行以 1d结尾的所有字符串。<br>&nbsp;&nbsp; 如果要匹配所有空行，执行以下操作：<br>&nbsp;&nbsp; ^$<br>&nbsp;&nbsp; 具体分析为匹配行首，又匹配行尾，中间没有任何模式，因此为空行。<br>&nbsp;&nbsp; 如果只返回包含一个字符的行，操作如下：<br>&nbsp;&nbsp; ^.$<br>&nbsp;&nbsp; 不像空白行，在行首与行尾之间有一个模式，代表任意单字符。<br>&nbsp;&nbsp; 如果在行尾匹配单词 jet01，操作如下：<br>&nbsp;&nbsp; jet01$<br>7.4 使用*匹配字符串中的单字符或其重复序列<br>&nbsp;&nbsp; 使用此特殊字符匹配任意字符或字符串的重复多次表达式。例如：<br>&nbsp;&nbsp; compu*t<br>&nbsp;&nbsp; 将匹配字符 u一次或多次：<br>&nbsp;&nbsp; 另一个例子：<br>&nbsp;&nbsp; 10133*<br>&nbsp;&nbsp; 匹配<br>&nbsp; 52&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>7.5 使用\屏蔽一个特殊字符的含义<br>&nbsp;&nbsp; 有时需要查找一些字符或字符串，而它们包含了系统指定为特殊字符的一个字符。什么<br>是特殊字符？一般意义上讲，下列字符可以认为是特殊字符：<br>&nbsp;&nbsp; 假定要匹配包含字符&#8220; .&#8221;的各行而&#8220;，&nbsp; &#8221;代表匹配任意单字符的特殊字符，因此需要屏蔽<br>其含义。操作如下：<br>&nbsp;&nbsp; \.<br>&nbsp;&nbsp; 上述模式不认为反斜杠后面的字符是特殊字符，而是一个普通字符，即句点。<br>&nbsp;&nbsp; 假定要匹配包含 ^的各行，将反斜杠放在它前面就可以屏蔽其特殊含义。如下：<br>&nbsp;&nbsp; \^<br>&nbsp;&nbsp; 如果要在正则表达式中匹配以 *.pas结尾的所有文件，可做如下操作：<br>&nbsp;&nbsp; \*\.pas<br>&nbsp;&nbsp; 即可屏蔽字符 *的特定含义。<br>7.6 使用[]匹配一个范围或集合<br>&nbsp;&nbsp; 使用 []匹配特定字符串或字符串集，可以用逗号将括弧内要匹配的不同字符串分开，但并<br>不强制要求这样做（一些系统提倡在复杂的表达式中使用逗号）&nbsp;&nbsp;&nbsp;&nbsp; ，这样做可以增加模式的可读<br>性。<br>&nbsp;&nbsp; 使用&#8220; - &#8221;表示一个字符串范围，表明字符串范围从&#8220; -&#8221;左边字符开始，到&#8220; - &#8221;右边字<br>符结束。<br>&nbsp;&nbsp; 如果熟知一个字符串匹配操作，应经常使用 []模式。<br>&nbsp;&nbsp; 假定要匹配任意一个数字，可以使用：<br>&nbsp;&nbsp; [0123456789]<br>&nbsp;&nbsp; 然而，通过使用&#8220; -&#8221;符号可以简化操作：<br>&nbsp;&nbsp; [0-9]<br>&nbsp;&nbsp; 或任意小写字母<br>&nbsp;&nbsp; [a-z]<br>&nbsp;&nbsp; 要匹配任意字母，则使用：<br>&nbsp;&nbsp; [A-Za-z]<br>&nbsp;&nbsp; 表明从 A-Z、a-z的字母范围。<br>&nbsp;&nbsp; 如要匹配任意字母或数字，模式如下：<br>&nbsp;&nbsp; [A-Za-z0-9]<br>&nbsp;&nbsp; 在字符序列结合使用中，可以用 [ ] 指出字符范围。假定要匹配一单词，以 s 开头，中间有<br>一任意字母，以 t结尾，那么操作如下：<br>&nbsp;&nbsp; s[a-z A-Z]t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 53<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第7章 正则表达式介绍<br>&nbsp;下载<br>&nbsp;&nbsp; 上述过程返回大写或小写字母混合的单词，如仅匹配小写字母，可使用：<br>&nbsp;&nbsp; s[a-z]t<br>&nbsp;&nbsp; 如要匹配 Computer或computer两个单词，可做如下操作：<br>&nbsp;&nbsp; [Cc]omputer<br>&nbsp;&nbsp; 为抽取诸如 Scout、shout、bought 等单词，使用下列表达式：<br>&nbsp;&nbsp; [ou] .*t<br>&nbsp;&nbsp; 匹配以字母 o或u开头，后跟任意一个字符任意次，并以 t结尾的任意字母。<br>&nbsp;&nbsp; 也许要匹配所有包含 system后跟句点的所有单词，这里 S可大写或小写。使用如下操作：<br>&nbsp;&nbsp; [ S, s ] y s t e m \ .<br>&nbsp;&nbsp; [ ]在指定模式匹配的范围或限制方面很有用。结合使用 * 与 [ ]更是有益，例如 [ A - Z a - Z ] *将<br>匹配所有单词。<br>&nbsp;&nbsp; [A-Za-z]*<br>&nbsp;&nbsp; 注意 ^符号的使用，当直接用在第一个括号里，意指否定或不匹配括号里内容。<br>&nbsp;&nbsp; [^a-zA-Z]<br>&nbsp;&nbsp; 匹配任一非字母型字符，而<br>&nbsp;&nbsp; [^0-9]<br>&nbsp;&nbsp; 匹配任一非数字型字符。<br>&nbsp;&nbsp; 通过最后一个例子，应可猜知除了使用 ^，还有一些方法用来搜索任意一个特殊字符。<br>7.7 使用\{\}匹配模式结果出现的次数<br>&nbsp;&nbsp; 使用 * 可匹配所有匹配结果任意次，但如果只要指定次数，就应使用 \ { \ } ，此模式有三种<br>形式，即：<br>&nbsp;&nbsp; pattern\{n\} 匹配模式出现 n次。<br>&nbsp;&nbsp; pattern\{n,\} 匹配模式出现最少 n次。<br>&nbsp;&nbsp; pattern\{n,m} 匹配模式出现 n到m次之间， n,m 为0-255中任意整数。<br>&nbsp;&nbsp; 请看第一个例子，匹配字母 A出现两次，并以 B结尾，操作如下：<br>&nbsp;&nbsp; A\{2\}B<br>匹配值为 AAB<br>&nbsp;&nbsp; 匹配 A至少 4次，使用：<br>&nbsp;&nbsp; A\{4,\}B<br>可以得结果 AAAAB或AAAAAAAB，但不能为 AAAB。<br>&nbsp;&nbsp; 如给出出现次数范围，例如 A出现 2次到 4次之间：<br>&nbsp;&nbsp; A\{2,4\}B<br>&nbsp;&nbsp; 则结果为 AAB、AAAB、AAAAB，而不是 AB或AAAAAB等。<br>&nbsp;&nbsp; 假定从下述列表中抽取代码：<br>&nbsp;&nbsp; 格式如下：前 4个字符是数字，接下来是 xx，最后 4个也是数字，操作如下：<br>&nbsp;54&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二部分 文 本 过 滤<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp; [ 0 - 9 ] \ { 4 \ }X X[ 0 - 9 ] \ { 4 \ }<br>&nbsp; 具体含义如下：<br>&nbsp; 1) 匹配数字出现 4次。<br>&nbsp; 2) 后跟代码 xx。<br>&nbsp; 3) 最后是数字出现 4次。<br>&nbsp; 结果为：<br>&nbsp; 在写正则表达式时，可能会有点难度或达不到预期效果，一个好习惯是在写真正的正则<br>表达式前先写下预期的输出结果。这样做，当写错时，可以逐渐修改，以消除意外结果，直<br>至返回正确值。为节省设计基本模式的时间，表 7-2 给出一些例子，这些例子并无特别顺序。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表7-2 经常使用的正则表达式举例<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对行首<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对行尾<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^[the]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对以the开头行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Ss]igna[lL]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对 匹配单词 s i g n a l、 s i g n a L 、<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Signal、SignaL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Ss]igna[lL]\.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对同上，但加一句点<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [mayMAY]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对包含 m a y大写或小写字母的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^USER$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对只包含USER的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [tty]$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对以tty结尾的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对带句点的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^d..x..x..x&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对对用户、用户组及其他用户<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组成员有可执行权限的目录<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^[^l]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对排除关联目录的目录列表<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [.*0]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对0之前或之后加任意字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [000*]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对000或更多个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [iI]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对大写或小写I<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [iI][nN]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对大写或小写i或n<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [^$]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对空行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [^.*$]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对匹配行中任意字符串<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^......$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对包括6个字符的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [a- zA-Z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对任意单字符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [a-z][a-z]*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对至少一个小写字母<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [^0-9\$]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对非数字或美元标识<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [^0-0A-Za-z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对非数字或字母<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [123]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对1到3中一个数字<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [Dd]evice&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对单词device或Device<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; De..ce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对前两个字母为 D e，后跟两个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任意字符，最后为 ce<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 55<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第7章 正则表达式介绍<br>&nbsp;下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （续）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \^q&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对以^q开始行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^.$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对仅有一个字符的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^\.[0-9][0-9]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对以一个句点和两个数字开始<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的行<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '"Device"'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对单词device<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; De[Vv]ice\.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对单词Device或device<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对日期格式dd-mm-yyyy<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\} 对IP地址格式nnn. nnn.nnn.nnn<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [^.*$]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对匹配任意行<br>7.8 小结<br>&nbsp;&nbsp; 在 s h e l l编程中，一段好的脚本与完美的脚本间的差别之一，就是要熟知正则表达式并学<br>会使用它们。相比较起来，用一个命令抽取一段文本比用三四个命令得出同样的结果要节省<br>许多时间。<br>&nbsp;&nbsp; 既然已经学会了正则表达式中经常使用的基本特殊字符，又通过一些例子简化了其复杂<br>操作，那么现在可以看一些真正的例程了。<br>&nbsp;&nbsp; 好，下面将讲述大量的 grep,sed和awk例程。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 21:09 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第六章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96454.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96454.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96454.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96454.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96454.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第6章&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令执行顺序<br>&nbsp;&nbsp; 在执行某个命令的时候，有时需要依赖于前一个命令是否执行成功。例如，假设你希望<br>将一个目录中的文件全部拷贝到另外一个目录中后，然后删除源目录中的全部文件。在删除<br>之前，你希望能够确信拷贝成功，否则就有可能丢失所有的文件。<br>&nbsp;&nbsp; 在本章中，我们将讨论：<br>&nbsp;&nbsp; &#8226; 命令执行控制。<br>&nbsp;&nbsp; &#8226; 命令组合。<br>&nbsp;&nbsp; 如果希望在成功地执行一个命令之后再执行另一个命令，或者在一个命令失败后再执行<br>另一个命令， &amp;&amp;和||可以完成这样的功能。相应的命令可以是系统命令或 shell脚本。<br>&nbsp;&nbsp; Shell还提供了在当前 shell或子 shell中执行一组命令的方法，即使用（）和 {}。<br>6.1 使用&amp;&amp;<br>&nbsp;&nbsp; 使用 &amp;&amp;的一般形式为：<br>&nbsp;&nbsp; 命令1 &amp; &amp; 命令2<br>&nbsp;&nbsp; 这种命令执行方式相当地直接。 &amp; &amp; 左边的命令（命令 1）返回真 (即返回 0，成功被执行）<br>后， &amp; &amp;右边的命令（命令 2）才能够被执行；换句话说，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;如果这个命令执行成功 &amp; &amp; 那么执<br>行这个命令&#8221;&nbsp;&nbsp; 。<br>&nbsp;&nbsp; 这里有一个使用 &amp;&amp;的简单例子：<br>&nbsp;&nbsp; 在上面的例子中， &amp; &amp; 前面的拷贝命令执行成功，所以 &amp; &amp; 后面的命令（ e c h o 命令）被执<br>行。<br>&nbsp;&nbsp; 再看一个更为实用的例子：<br>&nbsp;&nbsp; $ mv /apps/bin /apps/dev/bin &amp;&amp; rm -r /apps/bin<br>&nbsp;&nbsp; 在上面的例子中， /apps/bin目录将会被移到 /apps/dev/bin 目录下，如果它没有被成功执行，<br>就不会删除 /apps/bin目录。<br>&nbsp;&nbsp; 在下面的例子中，文件 q u a r t e r _ e n d . t x t 首先将被排序并输出到文件 q u a r t e r. s o r t e d 中，只有<br>这一命令执行成功之后，文件 quarter.sorted才会被打印出来：<br>&nbsp;&nbsp; $ sort quarter_end.txt &gt; quarter.sorted &amp;&amp; lp quarter.sorted<br>6.2 使用||<br>&nbsp;&nbsp; 使用 ||的一般形式为：<br>&nbsp;&nbsp; 命令1 | | 命令2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 47<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第6章 命令执行顺序<br>&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp; | | 的作用有一些不同。如果 | | 左边的命令（命令 1 ）未执行成功，那么就执行 | |右边的命令<br>（命令 2）；或者换句话说，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;如果这个命令执行失败了 || 那么就执行这个命令&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里有一个使用 ||的简单例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，拷贝命令没有能够被成功执行，因此 ||后面的命令被执行。<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里有一个更为实用的例子。我希望从一个审计文件中抽取第 1 个和第 5 个域，并将其输<br>&nbsp;出到一个临时文件中，如果这一操作未成功，我希望能够收到一个相应邮件：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在这里不只可以使用系统命令；这里我们首先对 m o n t h _ e n d . t x t文件执行了一个名为 c o m e t<br>的shell脚本，如果该脚本未执行成功，该 shell将结束。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ comet month_end.txt || exit<br>&nbsp;6.3 用（）和{ }将命令结合在一起<br>&nbsp;&nbsp;&nbsp; 如果希望把几个命令合在一起执行， s h e l l 提供了两种方法。既可以在当前 s h e l l 也可以在<br>&nbsp;子shell中执行一组命令。<br>&nbsp;&nbsp;&nbsp; 为了在当前 s h e l l 中执行一组命令，可以用命令分隔符隔开每一个命令，并把所有的命令<br>用圆括号（）括起来。<br>&nbsp;&nbsp;&nbsp;&nbsp; 它的一般形式为：<br>&nbsp;&nbsp;&nbsp; （命令 1 ;命令2 ;...）<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果使用 { }来代替（）&nbsp;&nbsp;&nbsp; ，那么相应的命令将在子 s h e l l而不是当前 s h e l l中作为一个整体被执<br>行，只有在 { } 中所有命令的输出作为一个整体被重定向时，其中的命令才被放到子 s h e l l 中执<br>行，否则在当前 shell 执行。它的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; {命令 1;命令 2; ...}<br>&nbsp;&nbsp;&nbsp;&nbsp; 我很少单独使用这两种方法。我一般只和 &amp;&amp;或||一起使用这两种方法。<br>&nbsp;&nbsp;&nbsp;&nbsp; 再回到前面那个 c o m e t脚本的例子，如果这个脚本执行失败了，我很可能会希望执行两个<br>&nbsp;以上的命令，而不只是一个命令。我可以使用这两种方法。这是原先那个例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ comet month_end.txt || exit<br>&nbsp;&nbsp;&nbsp; 现在如果该脚本执行失败了，我希望先给自己发个邮件，然后再退出，可以用下面的方<br>法来实现：<br>&nbsp;&nbsp;&nbsp; 在上面的例子中，如果只使用了命令分隔符而没有把它们组合在一起， s h e l l 将直接执行<br>最后一个命令（ exit）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。<br>&nbsp;&nbsp;&nbsp; 我们再回头来看看前面那个使用 &amp;&amp;排序的例子，下面是原来的那个例子：<br>&nbsp;&nbsp;&nbsp; $ sort quarter_end.txt &gt; quarter.sorted &amp;&amp; lp quarter.sorted<br>&nbsp;&nbsp;&nbsp; 使用命令组合的方法，如果 s o r t 命令执行成功了，可以先将输出文件拷贝到一个日志区，<br>&nbsp; 48&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>然后再打印。<br>6.4 小结<br>&nbsp;&nbsp; 在编写 s h e l l 脚本时，使用 &amp; &amp; 和 | |对构造判断语句非常有用。如果希望在前一个命令执行<br>失败的情况不执行后面的命令，那么本章所讲述的方法非常简单有效。使用这样的方法，可<br>以根据 &amp;&amp; 或||前面命令的返回值来控制其后面命令的执行。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 19:36 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第五章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96451.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 11:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96451.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96451.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96451.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96451.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell输入与输出<br>&nbsp;&nbsp; 在shell脚本中，可以用几种不同的方式读入数据：可以使用标准输入 — 缺省为键盘，或<br>者指定一个文件作为输入。对于输出也是一样：如果不指定某个文件作为输出，标准输出总<br>是和终端屏幕相关联。如果所使用命令出现了什么错误，它也会缺省输出到屏幕上，如果不<br>想把这些信息输出到屏幕上，也可以把这些信息指定到一个文件中。<br>&nbsp;&nbsp; 大多数使用标准输入的命令都指定一个文件作为标准输入。如果能够从一个文件中读取<br>数据，何必要费时费力地从键盘输入呢？<br>&nbsp;&nbsp; 本章我们将讨论以下内容：<br>&nbsp;&nbsp; &#8226; 使用标准输入、标准输出及标准错误。<br>&nbsp;&nbsp; &#8226; 重定向标准输入和标准输出。<br>&nbsp;&nbsp; 本章全面讨论了 shell对数据和信息的标准输入、标准输出，对重定向也做了一定的介绍。<br>5.1 echo<br>&nbsp;&nbsp; 使用 echo命令可以显示文本行或变量，或者把字符串输入到文件。它的一般形式为：<br>&nbsp;&nbsp; echo string<br>&nbsp;&nbsp; echo命令有很多功能，其中最常用的是下面几个：<br>&nbsp;&nbsp; \c 不换行。<br>&nbsp;&nbsp; \f 进纸。<br>&nbsp;&nbsp; \t 跳格。<br>&nbsp;&nbsp; \n 换行。<br>&nbsp;&nbsp; 如果希望提示符出现在输出的字符串之后，可以用：<br>&nbsp;&nbsp; 上面的命令将会有如下的显示：<br>&nbsp;&nbsp; 其中&#8220; □&#8221;是光标。<br>&nbsp;&nbsp; 如果想在输出字符之后，让光标移到下一行，可以用：<br>&nbsp;&nbsp; $ echo "The red pen ran out of ink"<br>&nbsp;&nbsp; 还可以用 e c h o 命令输出转义符以及变量。在下面的例子中，你可以让终端铃响一声，显<br>示出 $ H O M E 目录，并且可以让系统执行 t t y 命令 ( 注意，该命令用键盘左上角的符号，法语中<br>的抑音符引起来，不是单引号， )。<br>&nbsp;&nbsp; 如果是LINUX系统，那么......<br>&nbsp;&nbsp; 必须使用- n选项来禁止echo命令输出后换行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 35<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell 输入与输出<br>&nbsp;下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (续)<br>&nbsp;&nbsp;&nbsp; $ echo -n "What is your name :"<br>&nbsp;&nbsp;&nbsp; 必须使用-e选项才能使转义符生效：<br>&nbsp;&nbsp;&nbsp; 如果希望在 echo命令输出之后附加换行，可以使用 \n选项：<br>&nbsp;&nbsp;&nbsp; 运行时会出现如下输出：<br>&nbsp;&nbsp;&nbsp; 还可以在 echo语句中使用跳格符，记住别忘了加反斜杠 \：<br>&nbsp;&nbsp;&nbsp; 如果是LINUX系统，那么...<br>&nbsp;&nbsp;&nbsp; 别忘了使用- e选项才能使转义符生效：<br>&nbsp;&nbsp;&nbsp; 如果想把一个字符串输出到文件中，使用重定向符号 &gt; 。在下面的例子中一个字符串被重<br>定向到一个名为 myfile 的文件中：<br>&nbsp;&nbsp;&nbsp; $ echo "The log files have all been done"&gt; myfile<br>&nbsp;&nbsp;&nbsp; 或者可以追加到一个文件的末尾，这意味着不覆盖原有的内容：<br>&nbsp;&nbsp;&nbsp; $ echo "$LOGNAME carried them out at `date`"&gt;&gt;myfile<br>&nbsp;&nbsp;&nbsp; 现在让我们看一下 myfile文件中的内容：<br>&nbsp;&nbsp;&nbsp; 初涉 s h e l l 的用户常常会遇到的一个问题就是如何把双引号包含到 e c h o 命令的字符串中。<br>引号是一个特殊字符，所以必须要使用反斜杠 \来使 s h e l l 忽略它的特殊含义。假设你希望使用<br>echo命令输出这样的字符串： /dev/rmt0&#8221;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8220;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，那么我们只要在引号前面加上反斜杠 \即可：<br>&nbsp;&nbsp;&nbsp; $ echo "\"/dev/rmt0"\"<br>&nbsp;&nbsp;&nbsp; "/dev/rmt0"<br>5.2 read<br>&nbsp;&nbsp;&nbsp; 可以使用 read语句从键盘或文件的某一行文本中读入信息，并将其赋给一个变量。如果只<br>&nbsp;36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>指定了一个变量，那么 r e a d 将会把所有的输入赋给该变量，直至遇到第一个文件结束符或回<br>车。<br>&nbsp;&nbsp; 它的一般形式为：<br>&nbsp;&nbsp; read varible1 varible2 ...<br>&nbsp; 在下面的例子中，只指定了一个变量，它将被赋予直至回车之前的所有内容：<br>&nbsp; 在下面的例子中，我们给出了两个变量，它们分别被赋予名字和姓氏。 s h e l l 将用空格作<br>为变量之间的分隔符：<br>&nbsp; 如果输入文本域过长， Shell 将 所有的超长部分赋予最后一个变量。下面的例子，假定要<br>读取变量名字和姓，但这次输入三个名字；结果如下；<br>&nbsp;&nbsp; 在上面的例子中，如果我们输入字符串 John Lemon Doe ，那么第一个单词将被赋给第一<br>个变量，而由于变量数少于单词数，字符串后面的部分将被全部赋给第二个变量。<br>&nbsp; 在编写 shell脚本的时候，如果担心用户会对此感到迷惑，可以采用每一个 read语句只给一<br>个变量赋值的办法：<br>&nbsp; 用户在运行上面这个脚本的时候，就能够知道哪些信息赋给了哪个变量。<br>&nbsp; 如果是LINUX系统，那么......<br>&nbsp; 别忘了使用&#8220;-n&#8221;选项。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 37<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell输入与输出<br>&nbsp;下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （续）<br>5.3 cat<br>&nbsp;&nbsp; c a t是一个简单而通用的命令，可以用它来显示文件内容，创建文件，还可以用它来显示<br>控制字符。在使用 c a t命令时要注意，它不会在文件分页符处停下来；它会一下显示完整个文<br>件。如果希望每次显示一页，可以使用 m o r e命令或把 c a t命令的输出通过管道传递到另外一个<br>具有分页功能的命令中，请看下面的例子：<br>&nbsp;&nbsp; $ cat myfile | more<br>&nbsp;&nbsp; 或<br>&nbsp;&nbsp; $ cat myfile | pg<br>&nbsp;&nbsp; cat命令的一般形式为：<br>&nbsp;&nbsp; cat [options] filename1 ... filename2 ...<br>&nbsp;&nbsp; cat命令最有用的选项就是：<br>&nbsp;&nbsp; -v 显示控制字符<br>&nbsp;&nbsp; 如果希望显示名为 myfile的文件，可以用：<br>&nbsp;&nbsp; $ cat myfile<br>&nbsp;&nbsp; 如果希望显示 myfile1、myfile2、myfile3 这三个文件，可以用：<br>&nbsp;&nbsp; $ cat myfile1 myfile2 myfile3<br>&nbsp;&nbsp; 如果希望创建一个名为 bigfile的文件，该文件包含上述三个文件的内容，可以把上面命令<br>的输出重定向到新文件中：<br>&nbsp;&nbsp; $ cat myfile1 myfile2 myfile3 &gt; bigfile<br>&nbsp;&nbsp; 如果希望创建一个新文件，并向其中输入一些内容，只需使用 c a t 命令把标准输出重定向<br>到该文件中，这时 c a t 命令的输入是标准输入 — 键盘，你输入一些文字，输入完毕后按<br>&lt;CTRL-D&gt; 结束输入。这真是一个非常简单的文字编辑器！<br>&nbsp;&nbsp; 还可以使用 c a t命令来显示控制字符。这里有一个对从 D O S机器上 f t p 过来的文件进行检察<br>的例子，在这个例子中，所有的控制字符 &lt;CTRL-M&gt;都在行末显示了出来。<br>&nbsp;&nbsp; 有一点要提醒的是，如果在敲入了 c a t 以后就直接按回车，该命令会等你输入字符。如果<br>你本来就是要输入一些字符，那么它除了会在你输入时在屏幕上显示以外，还会再回显这些<br>&nbsp;&nbsp; 38&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>内容；最后按 &lt;CTRL-D&gt; 结束输入即可。<br>5.4 管道<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠 |表示。它的一<br>般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 命令 1 | 命令 2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中 |是管道符号。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中，在当前目录中执行文件列表操作，如果没有管道的话，所有文件就会<br>显示出来。当 s h e l l看到管道符号以后，就会把所有列出的文件交给管道右边的命令，因此管<br>道的含义正如它的名字所暗示的那样：把信息从一端传送到另外一端。在这个例子中，接下<br>来grep命令在文件列表中搜索 quarter1.doc：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们再来用一幅图形象地讲解刚才的例子（见图 5-1）&nbsp;&nbsp;&nbsp;&nbsp; ：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这就是管道<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Is 命令的输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图5-1 管道<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sed、awk和grep 都很适合用管道，特别是在简单的一行命令中。在下面的例子中， who命<br>令的输出通过管道传递给 awk 命令，以便只显示用户名和所在的终端。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果你希望列出系统中所有的文件系统，可以使用管道把 d f 命令的输出传递给 a w k 命令，<br>a w k 显示出其中的第一列。你还可以再次使用管道把 a w k的结果传递给 g r e p 命令，去掉最上面<br>的题头 filesystem。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然，你没准还会希望只显示出其中的分区名，不显示 / d e v / 部分，这没问题；我们只要<br>在后面简单地加上另一个管道符号和相应的 sed 命令即可。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 39<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell输入与输出<br>&nbsp;下载<br>&nbsp;&nbsp; 在这个例子中，我们先对一个文件进行排序，然后通过管道输送到打印机。<br>&nbsp;&nbsp; $ sort myfile | lp<br>5.5 tee<br>&nbsp;&nbsp; t e e命令作用可以用字母 T 来形象地表示。它把输出的一个副本输送到标准输出，另一个<br>副本拷贝到相应的文件中。如果希望在看到输出的同时，也将其存入一个文件，那么这个命<br>令再合适不过了。<br>&nbsp;&nbsp; 它的一般形式为：<br>&nbsp;&nbsp; tee -a files<br>&nbsp;&nbsp; 其中， -a表示追加到文件末尾。<br>&nbsp;&nbsp; 当执行某些命令或脚本时，如果希望把输出保存下来， tee命令非常方便。<br>&nbsp;&nbsp; 下面我们来看一个例子，我们使用 w h o命令，结果输出到屏幕上，同时保存在 w h o . o u t 文<br>件中：<br>&nbsp;&nbsp; 可以用图 5-2来表示刚才的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; who.out<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; screen<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; who命令的输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ who<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图5-2 tee<br>&nbsp;&nbsp; 在下面的例子中，我们把一些文件备份到磁带上，同时将所备份的文件记录在 t a p e . l o g文<br>件中。由于需要不断地对文件进行备份，为了保留上一次的日志，我们在 t e e 命令中使用了 - a<br>选项。<br>&nbsp;&nbsp; 在上面的例子中，第一行末尾的反斜杠 \ 告诉 s h e l l该命令尚未结束，应从下面一行继续读<br>入该命令。<br>&nbsp;&nbsp; 可以在执行脚本之前，使用一个 e c h o 命令告诉用户谁在执行这个脚本，输出结果保存在<br>&nbsp;&nbsp; 40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>什么地方。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果不想把输出重定向到文件中，可以不这样做，而是把它定向到某个终端上。在下面<br>的例子中，一个警告被发送到系统控制台上，表明一个磁盘清理进程即将运行。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ echo "stand-by disk cleanup starting in 1 minute"| tee /dev/console<br>&nbsp;&nbsp;&nbsp;&nbsp; 可以让不同的命令使用同一个日志文件，不过不要忘记使用 -a选项。<br>5.6 标准输入、输出和错误<br>&nbsp;&nbsp;&nbsp;&nbsp; 当我们在 s h e l l 中执行命令的时候，每个进程都和三个打开的文件相联系，并使用文件描<br>述符来引用这些文件。由于文件描述符不容易记忆， shell同时也给出了相应的文件名。<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面就是这些文件描述符及它们通常所对应的文件名：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文&nbsp; 件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文件描述符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输入文件 — 标准输入&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 输出文件 — 标准输出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 错误输出文件 — 标准错误&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2<br>&nbsp;&nbsp;&nbsp;&nbsp; 系统中实际上有 12个文件描述符，但是正如我们在上表中所看到的， 0、1、2是标准输入、<br>输出和错误。可以任意使用文件描述符 3到9。<br>5.6.1 标准输入<br>&nbsp;&nbsp;&nbsp;&nbsp; 标准输入是文件描述符0。它是命令的输入，缺省是键盘，也可以是文件或其他命令的输出。<br>5.6.2 标准输出<br>&nbsp;&nbsp;&nbsp;&nbsp; 标准输出是文件描述符 1。它是命令的输出，缺省是屏幕，也可以是文件。<br>5.6.3 标准错误<br>&nbsp;&nbsp;&nbsp;&nbsp; 标准错误是文件描述符 2。这是命令错误的输出，缺省是屏幕，同样也可以是文件。你可<br>能会问，为什么会有一个专门针对错误的特殊文件？这是由于很多人喜欢把错误单独保存到<br>一个文件中，特别是在处理大的数据文件时，可能会产生很多错误。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果没有特别指定文件说明符，命令将使用缺省的文件说明符（你的屏幕，更确切地说<br>是你的终端）&nbsp;&nbsp;&nbsp;&nbsp; 。<br>5.7 文件重定向<br>&nbsp;&nbsp;&nbsp;&nbsp; 在执行命令时，可以指定命令的标准输入、输出和错误，要实现这一点就需要使用文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 41<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell 输入与输出<br>&nbsp;下载<br>重定向。表 5-1列出了最常用的重定向组合，并给出了相应的文件描述符。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在对标准错误进行重定向时，必须要使用文件描述符，但是对于标准输入和输出来说，<br>这不是必需的。为了完整起见，我们在表 5-1 中列出了两种方法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表5-1 常用文件重定向命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出重定向到一个新文件中<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt; filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出重定向到一个文件中 ( 追加 )<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt;&gt; filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出重定向到一个文件中<br>&nbsp;&nbsp;&nbsp;&nbsp; command 1 &gt; fielname<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出和标准错误一起重定向到一个文件中<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt; filename 2&gt;&amp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准错误重定向到一个文件中<br>&nbsp;&nbsp;&nbsp;&nbsp; command 2 &gt; filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出重定向到一个文件中 ( 追加 )<br>&nbsp;&nbsp;&nbsp;&nbsp; command 2 &gt;&gt; filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出和标准错误一起重定向到一个文件中 ( 追加 )<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt;&gt; filename 2&gt;&amp;1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把 c o m m a n d命令以 f i l e n a m e 文件作为标准输入，以 f i l e n a m e 2 文件<br>&nbsp;&nbsp;&nbsp;&nbsp; command &lt; filename &gt;filename2<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为标准输出<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把 command 命令以 filename 文件作为标准输入<br>&nbsp;&nbsp;&nbsp;&nbsp; command &lt; filename<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把从标准输入中读入，直至遇到 delimiter 分界符<br>&nbsp;&nbsp;&nbsp;&nbsp; command &lt;&lt; delimiter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把文件描述符 m 作为标准输入<br>&nbsp;&nbsp;&nbsp;&nbsp; command &lt;&amp;m<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把把标准输出重定向到文件描述符 m 中<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt;&amp;m<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把关闭标准输入<br>&nbsp;&nbsp;&nbsp;&nbsp; command &lt;&amp;-<br>5.7.1 重定向标准输出<br>&nbsp;&nbsp;&nbsp;&nbsp; 让我们来看一个标准输出的例子。在下面的命令中，把 / e t c / p a s s w d文件中的用户 I D 域按<br>照用户命排列。该命令的输出重定向到 sort.out文件中。要提醒注意的是，在使用 sort命令的时<br>候 (或其他含有相似输入文件参数的命令 ) ，重定向符号一定要离开 s o r t 命令两个空格，否则该<br>命令会把它当作输入文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ cat passwd | awk -F: '{print $1}' | sort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&gt;sort.out<br>&nbsp;&nbsp;&nbsp;&nbsp; 从表 5-1中可以看出，我们也可以使用如下的表达方式，结果和上面一样：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ cat passwd | awk -F: '{print $1}' | sort&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;sort.out<br>&nbsp;&nbsp;&nbsp;&nbsp; 可以把很多命令的输出追加到同一文件中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，所有的目录名和以 account开头的文件名都被写入到 file.out文件中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望把标准输出重定向到文件中，可以用 &gt; f i l e n a m e。在下面的例子中， l s 命令的所<br>有输出都被重定向到 ls.out文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ ls &gt;ls.out<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望追加到已有的文件中 ( 在该文件不存在的情况下创建该文件 ) ，那么可以使用<br>&gt;&gt;filename：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果想创建一个长度为 0的空文件，可以用 '&gt;filename'：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ &gt;myfile<br>&nbsp;&nbsp; 42&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>5.7.2 重定向标准输入<br>&nbsp;&nbsp;&nbsp;&nbsp; 可以指定命令的标准输入。在 awk一章就会遇到这样的情况。下面给出一个这样的例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ sort&nbsp;&nbsp;&nbsp;&nbsp; &lt; name.txt<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的命令中， s o r t命令的输入是采用重定向的方式给出的，不过也可以直接把相应的<br>文件作为该命令的参数：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ sort name.txt<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，还可以更进一步地通过重定向为 s o r t 命令指定一个输出文件 n a m e . o u t。<br>这样屏幕上将不会出现任何信息 ( 除了错误信息以外 )：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ sort&nbsp;&nbsp;&nbsp;&nbsp; &lt;name.txt &gt;name.out<br>&nbsp;&nbsp;&nbsp;&nbsp; 在发送邮件时，可以用重定向的方法发送一个文件中的内容。在下面的例子中，用户<br>louise将收到一个邮件，其中含有文件 contents.txt中的内容：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ mail louise &lt; contents.txt<br>&nbsp;&nbsp;&nbsp;&nbsp; 重定向操作符 command &lt;&lt; delimiter 是一种非常有用的命令，通常都被称为&#8220;此处&#8221;文挡。<br>我们将在本书后面的章节深入讨论这一问题。现在只介绍它的功能。 shell将分界符 delimiter之<br>后直至下一个同样的分界符之前的所有内容都作为输入，遇到下一个分界符， s h e l l 就知道输<br>入结束了。这一命令对于自动或远程的例程非常有用。可以任意定义分界符 delimiter，最常见<br>的是 E O F ，而我最喜欢用 M AY D AY ，这完全取决于个人的喜好。还可以在 &lt; &lt; 后面输入变量。<br>下面给出一个例子，我们创建了一个名为 myfile的文件，并在其中使用了 TERM 和LOGNAME<br>变量。<br>5.7.3 重定向标准错误<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了重定向标准错误，可以指定文件描述符 2。让我们先来看一个例子，因为举例子往往<br>会让人更容易明白。在这个例子中， grep命令在文件 missiles中搜索 trident 字符串：<br>&nbsp;&nbsp;&nbsp;&nbsp; g r e p 命令没有找到该文件，缺省地向终端输出了一个错误信息。现在让我们把错误重定<br>向到文件 /dev/null 中(实际就上是系统的垃圾箱 )：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ grep "trident" missiles 2&gt;/dev/null<br>&nbsp;&nbsp;&nbsp;&nbsp; 这样所有的错误输出都输送到了 /dev/null，不再出现在屏幕上。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果你在对更重要的文件进行操作，可能会希望保存相应的错误。下面就是一个这样的<br>例子，这一次错误被保存到 grep.err 文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 43<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell 输入与输出<br>&nbsp;下载<br>&nbsp;&nbsp; 还 可以把错误追加到一个文件中。在使用一组命令完成同一个任务时，这种方法非常有<br>用。在下面的例子中，两个 g r e p命令把错误都输出到同一个文件中；由于我们使用了 &gt; &gt; 符号<br>进行追加，后面一个命令的错误 (如果有的话 )不会覆盖前一个命令的错误。<br>5.8 结合使用标准输出和标准错误<br>&nbsp;&nbsp; 一个快速发现错误的方法就是，先将输出重定向到一个文件中，然后再把标准错误重定<br>向到另外一个文件中。下面给出一个例子：<br>&nbsp;&nbsp; 我有两个审计文件，其中一个的确存在，而且包含一些信息，而另一个由于某种原因已<br>经不存在了 ( 但我不知道 )。我想把这两个文件合并到 accounts.out文件中。<br>&nbsp;&nbsp; $ cat account_qtr.doc account_end.doc 1&gt;accounts.out 2&gt;accounts.err<br>&nbsp;&nbsp; 现在如果出现了错误，相应的错误将会保存在 accounts.err文件中。<br>&nbsp;&nbsp; 我事先并不知道是否存在 a c c o u n t _ e n d . d o c文件，使用上面的方法能够快速发现其中的错<br>误。<br>5.9 合并标准输出和标准错误<br>&nbsp;&nbsp; 在合并标准输出和标准错误的时候，切记 s h e l l 是从左至右分析相应的命令的。下面给出<br>一个例子：<br>&nbsp;&nbsp; $ cleanup &gt;cleanup.out 2&gt;&amp;1<br>&nbsp;&nbsp; 在上面的例子中，我们将 c l e a n u p脚本的输出重定向到 c l e a n u p . o u t 文件中，而且其错误也<br>被重定向到相同的文件中。<br>&nbsp;&nbsp; $ grep "standard"* &gt; grep.out 2&gt;&amp;1<br>&nbsp;&nbsp; 在上面的例子中， g r e p 命令的标准输出和标准错误都被重定向到 g r e p . o u t文件中。你在使<br>用前面提到的&#8220;此处&#8221;文挡时，有可能需要把所有的输出都保存到一个文件中，这样万一出<br>现了错误，就能够被记录下来。通过使用 2&gt;&amp;1就可以做到这一点，下面给出一个例子：<br>&nbsp;&nbsp; 上面的例子演示了如何把所有的输出捕捉到一个文件中。在使用 c a t命令的时候，这可能<br>&nbsp;&nbsp;&nbsp; 44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>没 什么用处，不过如果你使用&#8220;此处&#8221;文挡连接一个数据库管理系统&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( 例如使用 i s q l 连接<br>s y b a s e ) 或使用 f t p，这一点就变得非常重要了，因为这样就可以捕捉到所有的错误，以免这些<br>错误在屏幕上一闪而过，特别是在你不在的时候。<br>5.10 exec<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec命令可以用来替代当前 shell ；换句话说，并没有启动子 shell。使用这一命令时任何现<br>有环境都将会被清除，并重新启动一个 shell 。它的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exec command<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中的 command通常是一个 shell 脚本。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我所能够想像得出的描述 exec命令最贴切的说法就是：它践踏了你当前的 shell 。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当这个脚本结束时，相应的会话可能就结束了。 e x e c 命令的一个常见用法就是在用户<br>的 . p r o f i l e 最后执行时，用它来执行一些用于增强安全性的脚本。如果用户的输入无效，该<br>shell 将被关闭，然后重新回到登录提示符。 exec还常常被用来通过文件描述符打开文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记住， e x e c 在对文件描述符进行操作的时候（也只有在这时）&nbsp;&nbsp;&nbsp;&nbsp; ，它不会覆盖你当前的<br>shell。<br>5.11 使用文件描述符<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以使用 e x e c 命令通过文件描述符打开和关闭文件。在下面的例子中，我选用了文件描<br>述符 4，实际上我可以在 4 到9 之间任意选择一个数字。下面的脚本只是从 s t o c k . t x t文件中读了<br>两行，然后把这两行回显出来。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该脚本的第一行把文件描述符 4 指定为标准输入，然后打开 s t o c k . t x t 文件。接下来两行的<br>作用是读入了两行文本。接着，作为标准输入的文件描述符 4被关闭。最后， line1和line2两个<br>变量所含有的内容被回显到屏幕上。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是这个小小的股票文件 stock.txt的内容：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是该脚本的运行结果：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面是一个关于文件描述符应用的简单例子。它看起来没有什么用处。在以后讲解循环<br>的时候，将会给出一个用文件描述符代替 cp 命令拷贝文本文件的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 45<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5章 shell输入与输出<br>&nbsp;下载<br>5.12 小结<br>&nbsp;&nbsp; 本书通篇可见重定向的应用，因为它是 s h e l l 中的一个重要部分。通过重定向，可以指定<br>命令的输入；如果有错误的话，可以用一个单独的文件把它们记录下来，这样就可以方便快<br>捷地查找问题。<br>&nbsp;&nbsp; 这里没有涉及的就是文件描述符的应用 (3 ～9) 。要想应用这些文件描述符，就一定会涉及<br>循环方法，在后面讲到循环方法的时候，我们会再次回过头来讲述有关文件描述符的问题。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 19:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第四章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96420.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96420.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96420.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96420.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96420.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96420.html</trackback:ping><description><![CDATA[<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第4章&nbsp;&nbsp; 文件名置换<br>&nbsp;&nbsp; 当你在使用命令行时，有很多时间都用来查找你所需要的文件。 S h e l l提供了一套完整的<br>字符串模式匹配规则，或者称之为元字符，这样你就可以按照所要求的模式来匹配文件。还<br>可以使用字符类型来匹配文件名。在命令行方式下，使用元字符更为快捷，所以在本章我们<br>只介绍这部分内容。<br>&nbsp;&nbsp; 在本章我们将讨论：<br>&nbsp;&nbsp; &#8226; 匹配文件名中的任何字符串。<br>&nbsp;&nbsp; &#8226; 匹配文件名中的单个字符。<br>&nbsp;&nbsp; &#8226; 匹配文件名中的字母或数字字符。<br>&nbsp;&nbsp; 下面就是这些特殊字符：<br>&nbsp;&nbsp; * 匹配文件名中的任何字符串，包括空字符串。<br>&nbsp;&nbsp; ？ 匹配文件名中的任何单个字符。<br>&nbsp;&nbsp; [...] 匹配 [ ] 中所包含的任何字符。<br>&nbsp;&nbsp; [!...] 匹配 [ ] 中非感叹号！之后的字符。<br>&nbsp;&nbsp; 当 s h e l l遇到上述字符时，就会把它们当作特殊字符，而不是文件名中的普通字符，这样<br>用户就可以用它们来匹配相应的文件名。<br>4.1 使用*<br>&nbsp;&nbsp; 使用星号 *可以匹配文件名中的任何字符串。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中，我们给出文件名模式 app*，<br>它的意思是文件名以 app开头，后面可以跟随任何字符串，包括空字符串：<br>&nbsp;&nbsp; *也可以用在文件名模式的开头，在下面的例子中， *.doc匹配所有以 .doc结尾的 文件名：<br>&nbsp;&nbsp; *还可以用在文件名的当中，在下面的例子中， c l * . s e d用于匹配所有以 c l 开头、后面跟任<br>何字符串、最后以 .sed 结尾的文件名：<br>&nbsp;&nbsp; 在使用 c d 命令切换路径时，使用星号还可以省去输入整个路径名的麻烦，下面给出一个<br>这样的例子：<br>&nbsp;&nbsp; 32&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>4.2 使用？<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用可以匹配文件名中的任何单个字符。在下面的例子中，我们列出文件名以任意两个<br>字符开头，接着是 R，后面跟任何字符的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中，我们列出文件名以 c o n f 开头、中间是任意两个字符、最后以 . l o g 结尾的<br>文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中， f ? ? * s匹配所有以 f 开头、中间是任意两个字符、后面跟随任意字符串、<br>并以 s 结尾的文件名：<br>4.3 使用[...]和[!...]<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用 [...]可以用来匹配方括号 [ ] 中的任何字符。在这一方法中，还可以使用一个横杠 -来连<br>接两个字母或数字，以此来表示一个范围。在下面的例子中，列出了以 i或o开头的文件名：<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了匹配所有以 l o g . 开头、后面跟随一个数字、然后可以是任意字符串的文件名，可以用<br>log.[0-9]*，其中 [0-9] 表示任意单个数字，星号 *代表了其他字符：<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面的例子和刚才的有所不同，使用 [ ! 0 - 9 ] *来表示非数字开头的字符串，其中 ! 是非的意<br>思：<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面的例子中，列出了所有以LPS开头、中间可以是任何两个字符，最后以1结尾的文件名：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 33<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第4章 文件名置换<br>&nbsp;下载<br>&nbsp;&nbsp; 下面的例子中，列出了所有以 LPS开头、中间可以是任何两个字符，后面跟随一个非数字<br>字符、然后是任意字符串的文件名：<br>&nbsp;&nbsp; 为了列出所有以大写字母开头的文件名，可以用：<br>&nbsp;&nbsp; $ ls [A-Z]*<br>&nbsp;&nbsp; 为了列出所有以小写字母开头的文件名，可以用：<br>&nbsp;&nbsp; $ ls [a-z]*<br>&nbsp;&nbsp; 为了列出所有以数字开头的文件名，可以用：<br>&nbsp;&nbsp; $ ls [0-9]*<br>&nbsp;&nbsp; 为了列出所有以 . 开头的文件名（隐含文件，例如 .profile、.rhosts、.history等等），可以<br>用：<br>&nbsp;&nbsp; $ ls .*<br>4.4 小结<br>&nbsp;&nbsp; 使用元字符可以大大减少你在查找文件名上的工作量。这是一种非常有效的模式匹配方<br>法，在后面的章节中，我们还将在讨论正则表达式的时候对文本处理中所涉及到的元字符进<br>行更为详尽的讨论。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 15:20 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第三章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96418.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Wed, 16 Sep 2009 07:05:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96418.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96418.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96418.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96418.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96418.html</trackback:ping><description><![CDATA[&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3章 后台执行命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当你在终端或控制台工作时，可能不希望由于运行一个作业而占住了屏幕，因为可能还<br>有更重要的事情要做，比如阅读电子邮件。对于密集访问磁盘的进程，你可能希望它能够在<br>每天的非负荷高峰时间段运行。为了使这些进程能够在后台运行，也就是说不在终端屏幕上<br>运行，有几种选择方法可供使用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在本章中我们将讨论：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 设置 crontab文件，并用它来提交作业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 使用 at命令来提交作业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 在后台提交作业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 使用 nohup命令提交作业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 名词解释：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业，或在一周或一月<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cron<br>中的不同时段运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; At at 命令。使用它在一个特定的时间运行一些特殊的作业，或在晚一些的非负荷高峰时<br>间段或高峰负荷时间段运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp; 使用它在后台运行一个占用时间不长的进程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nohup 使用它在后台运行一个命令，即使在用户退出时也不受影响。<br>3.1 cron和crontab<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c r o n 是系统主要的调度进程，可以在无需人工干预的情况下运行作业。有一个叫做<br>c r o n t a b 的命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个 c r o n t a b文件<br>来保存调度信息。可以使用它运行任意一个 s h e l l 脚本或某个命令，每小时运行一次，或一周<br>三次，这完全取决于你。每一个用户都可以有自己的 c r o n t a b 文件，但在一个较大的系统中，<br>系统管理员一般会禁止这些文件，而只在整个系统保留一个这样的文件。系统管理员是通过<br>cron.deny和cron.allow这两个文件来禁止或允许用户拥有自己的 crontab文件。<br>3.1.1 crontab的域<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了能够在特定的时间运行作业，需要了解 c r o n t a b文件每个条目中各个域的意义和格式。<br>下面就是这些域：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第1列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 分钟 1～59<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 小时 1～23（0表示子夜）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日1～31<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第4列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 月1～12<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第5列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 星期 0～6（0表示星期天）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第6列&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要运行的命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 23<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3章 后台执行命令<br>&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面是 crontab的格式：<br>&nbsp;&nbsp;&nbsp;&nbsp; 分&lt;&gt;时&lt;&gt;日&lt;&gt;月&lt;&gt;星期 &lt;&gt;要运行的命令<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中 &lt;&gt;表示空格。<br>&nbsp;&nbsp;&nbsp;&nbsp; C r o n t a b文件的一个条目是从左边读起的，第一列是分，最后一列是要运行的命令，它位<br>于星期的后面。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在这些域中，可以用横杠 - 来表示一个时间范围，例如你希望星期一至星期五运行某个作<br>业，那么可以在星期域使用 1 - 5 来表示。还可以在这些域中使用逗号&#8220;,&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，例如你希望星期一<br>和星期四运行某个作业，只需要使用 1 , 4来表示。可以用星号 * 来表示连续的时间段。如果你<br>对某个表示时间的域没有特别的限定，也应该在该域填入 * 。该文件的每一个条目必须含有 5<br>个时间域，而且每个域之间要用空格分隔。该文件中所有的注释行要在行首用 #来表示。<br>3.1.2 crontab条目举例<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里有 crontab文件条目的一些例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; 30 21* * * /apps/bin/cleanup.sh<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子表示每晚的 21:30运行 /apps/bin目录下的 cleanup.sh 。<br>&nbsp;&nbsp;&nbsp;&nbsp; 45 4 1,10,22 * * /apps/bin/backup.sh<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子表示每月 1、10、22日的 4:45运行 /apps/bin目录下的 backup.sh。<br>&nbsp;&nbsp;&nbsp;&nbsp; 10 1 * * 6,0 /bin/find -name "core" -exec rm {} \;<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子表示每周六、周日的 1:10运行一个 find命令。<br>&nbsp;&nbsp;&nbsp;&nbsp; 0,30 18-23 * * * /apps/bin/dbcheck.sh<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子表示在每天 18:00至23:00之间每隔 30分钟运行 /apps/bin 目录下的 dbcheck.sh。<br>&nbsp;&nbsp;&nbsp;&nbsp; 0 23 * * 6 /apps/bin/qtrend.sh<br>&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子表示每星期六的 11:00pm运行 /apps/bin目录下的 qtrend.sh。<br>&nbsp;&nbsp;&nbsp;&nbsp; 你可能已经注意到上面的例子中，每个命令都给出了绝对路径。当使用 c r o n t a b 运行 s h e l l<br>脚本时，要由用户来给出脚本的绝对路径，设置相应的环境变量。记住，既然是用户向 c r o n<br>提交了这些作业，就要向 cron提供所需的全部环境。不要假定 cron知道所需要的特殊环境，它<br>其实并不知道。所以你要保证在 s h e l l 脚本中提供所有必要的路径和环境变量，除了一些自动<br>设置的全局变量。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果 cron不能运行相应的脚本，用户将会收到一个邮件说明其中的原因。<br>3.1.3 crontab命令选项<br>&nbsp;&nbsp;&nbsp;&nbsp; crontab命令的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; Crontab [-u user] -e -l -r<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中：<br>&nbsp;&nbsp;&nbsp;&nbsp; -u 用户名。<br>&nbsp;&nbsp;&nbsp;&nbsp; -e 编辑 crontab文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -l 列出 crontab文件中的内容。<br>&nbsp;&nbsp;&nbsp;&nbsp; -r 删除 crontab文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果使用自己的名字登录，就不用使用 - u选项，因为在执行 c r o n t a b 命令时，该命令能够<br>&nbsp;&nbsp; 24&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>知道当前的用户。<br>3.1.4 创建一个新的crontab文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在考虑向 c r o n 进程提交一个 c r o n t a b 文件之前，首先要做的一件事情就是设置环境变量<br>E D I TO R。c r o n 进程根据它来确定使用哪个编辑器编辑 c r o n t a b文件。 9 9 %的 U N I X和 L I N U X用<br>户都使用 v i ，如果你也是这样，那么你就编辑 $ H O M E 目录下的 . p r o f i l e文件，在其中加入这样<br>一行：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EDITOR=vi; export EDITOR<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后保存并退出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不妨创建一个名为 &lt; u s e r &gt; c r o n 的文件，其中 &lt; u s e r &gt;是用户名，例如， d a v e c r o n 。在该文件<br>中加入如下的内容。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 保存并退出。确信前面 5个域用空格分隔。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，系统将每隔 1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起，<br>从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中，用 tty1来表<br>示控制台，可以根据实际情况对上面的例子进行相应的修改。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了提交你刚刚创建的 crontab文件，可以把这个新创建的文件作为 cron命令的参数：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ crontab davecron<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在该文件已经提交给 cron进程，它将每隔 15分钟运行一次。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同时，新创建文件的一个副本已经被放在 /var/spool/cron 目录中，文件名就是用户名（即，<br>dave）&nbsp; 。<br>3.1.5 列出crontab文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了列出 crontab文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你将会看到和上面类似的内容。可以使用这种方法在 $ H O M E目录中对 c r o n t a b 文件做一备<br>份：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ crontab -l &gt; $HOME/mycron<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，一旦不小心误删了 crontab文件，可以用上一节所讲述的方法迅速恢复。<br>3.1.6 编辑crontab文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果希望添加、删除或编辑 crontab文件中的条目，而 EDITOR 环境变量又设置为 vi，那么<br>就可以用 vi来编辑 crontab文件，相应的命令为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ crontab -e<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以像使用 v i 编辑其他任何文件那样修改 c r o n t a b文件并退出。如果修改了某些条目或添<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 25<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3章 后台执行命令<br>&nbsp; 下载<br>加了新的条目，那么在保存该文件时， c r o n 会对其进行必要的完整性检查。如果其中的某个<br>域出现了超出允许范围的值，它会提示你。<br>&nbsp;&nbsp;&nbsp;&nbsp; 我们在编辑 crontab文件时，没准会加入新的条目。例如，加入下面的一条：<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在保存并退出。最好在 c r o n t a b 文件的每一个条目之上加入一条注释，这样就可以知道<br>它的功能、运行时间，更为重要的是，知道这是哪位用户的作业。<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在让我们使用前面讲过的 crontab -l 命令列出它的全部信息：<br>3.1.7 删除crontab文件<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了删除 crontab文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ crontab -r<br>3.1.8 恢复丢失的crontab文件<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果不小心误删了 c r o n t a b文件，假设你在自己的 $ H O M E目录下还有一个备份，那么可以<br>将其拷贝到 /var/spool/cron/&lt;username&gt;，其中 &lt;username&gt;是用户名。如果由于权限问题无法完<br>成拷贝，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ crontab &lt;filename&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中， &lt;filename&gt;是你在 $HOME目录中副本的文件名。<br>&nbsp;&nbsp;&nbsp;&nbsp; 我建议你在自己的 $ H O M E目录中保存一个该文件的副本。我就有过类似的经历，有数次<br>误删了 crontab 文件（因为 r键紧挨在 e 键的右边 &#8230;）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。这就是为什么有些系统文档建议不要直接<br>编辑 crontab文件，而是编辑该文件的一个副本，然后重新提交新的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 有些 c r o n t a b的变体有些怪异，所以在使用 c r o n t a b 命令时要格外小心。如果遗漏了任何选<br>项， crontab可能会打开一个空文件，或者看起来像是个空文件。这时敲 delete键退出，不要按<br>&lt;Ctrl-D&gt;，否则你将丢失 crontab文件。<br>3.2 at命令<br>&nbsp;&nbsp;&nbsp;&nbsp; a t命令允许用户向 c r o n守护进程提交作业，使其在稍后的时间运行。这里稍后的时间可能<br>是指 10min以后，也可能是指几天以后。如果你希望在一个月或更长的时间以后运行，最好还<br>是使用 crontab文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 一旦一个作业被提交， a t 命令将会保留所有当前的环境变量，包括路径，不象 c r o n t a b ，<br>只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户，除非你对其输出<br>进行了重定向，绝大多数情况下是重定向到某个文件中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 和c r o n t a b 一样，根用户可以通过 / e t c 目录下的 a t . a l l o w和 a t . d e n y文件来控制哪些用户可以<br>&nbsp;&nbsp; 26&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>使用 at命令，哪些用户不行。不过一般来说，对 at命令的使用不如对 crontab的使用限制那么严<br>格。<br>&nbsp;&nbsp;&nbsp;&nbsp; at命令的基本形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; at [-f script] [-m -l -r] [time] [date]<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中，<br>&nbsp;&nbsp;&nbsp;&nbsp; -f script 是所要提交的脚本或命令。<br>&nbsp;&nbsp;&nbsp;&nbsp; -l 列出当前所有等待运行的作业。 atq命令具有相同的作用。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除作业。为了清除某个作业，还要提供相应的作业标识（ I D）；有些 U N I X 变体只<br>&nbsp;&nbsp;&nbsp;&nbsp; -r<br>接受 atrm 作为清除命令。<br>&nbsp;&nbsp;&nbsp;&nbsp; -m 作业完成后给用户发邮件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; at 命令的时间格式非常灵活；可以是 H 、H H . H H M M、 H H : M M或H : M ，其中 H和M<br>&nbsp;&nbsp;&nbsp;&nbsp; time<br>分别是小时和分钟。还可以使用 a.m.或p.m.。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期格式可以是月份数或日期数，而且 at命令还能够识别诸如 today、tomorrow这样<br>&nbsp;&nbsp;&nbsp;&nbsp; date<br>的词。<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在就让我们来看看如何提交作业。<br>3.2.1 使用at命令提交命令或脚本<br>&nbsp;&nbsp;&nbsp;&nbsp; 使用 at命令提交作业有几种不同的形式，可以通过命令行方式，也可以使用 at命令提示符。<br>一般来说在提交若干行的系统命令时，我使用 at命令提示符方式，而在提交 shell脚本时，使用<br>命令行方式。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果你想提交若干行的命令，可以在 at命令后面跟上日期 /时间并回车。然后就进入了 at命<br>令提示符，这时只需逐条输入相应的命令，然后按&#8216; &lt;CTRL-D&gt;&#8217;退出。下面给出一个例子：<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中， &lt; E O T &gt; 就是 &lt; C T R L - D &gt; 。在 2 1 : 1 0 系统将执行一个简单的 f i n d命令。你应当已经注<br>意到，我所提交的作业被分配了一个唯一标识 job 1 。该命令在完成以后会将全部结果以邮件<br>的形式发送给我。<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面就是我从这个邮件中截取的一部分：<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面这些日期 /时间格式都是 at命令可以接受的：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 27<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3章 后台执行命令<br>&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果希望向 at命令提交一个 shell脚本，使用其命令行方式即可。在提交脚本时使用 -f选项。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，一个叫做 db_table.sh的脚本将在明天下午 3:00运行。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还可以使用 echo命令向 at命令提交作业：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ echo find /etc -name "passwd" -print | at now +1 minute<br>3.2.2 列出所提交的作业<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个作业被提交后，可以使用 at -l 命令来列出所有的作业：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其中，第一行是作业标识，后面是作业运行的日期 /时间。最后一列 a代表 a t 。还可以使用<br>a t q 命令来完成同样的功能，它是 a t 命令的一个链接。当提交一个作业后，它就被拷贝到<br>/var/spool/at目录中，准备在要求的时间运行。<br>3.2.3 清除一个作业<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 清除作业的命令格式为：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; atrm [job no] at -r [job no]<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要清除某个作业，首先要执行 at -l 命令，以获取相应的作业标识，然后对该作业标识使用<br>at -r 命令，清除该作业。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有些系统使用 at-r [job no] 命令清除作业。<br>3.3 &amp;命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当在前台运行某个作业时，终端被该作业占据；而在后台运行作业时，它不会占据终端。<br>&nbsp;&nbsp; 28&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>可以使用 &amp;命令把作业放到后台执行。<br>&nbsp;&nbsp;&nbsp;&nbsp; 该命令的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; 命令 &amp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 为什么要在后台执行命令？因为当在后台执行命令时，可以继续使用你的终端做其他事<br>情。适合在后台运行的命令有 find、费时的打印作业、费时的排序及一些 shell脚本。在后台运<br>行作业时要当心：需要用户交互的命令不要放在后台执行，因为这样你的机器就会在那里傻<br>等。<br>&nbsp;&nbsp;&nbsp;&nbsp; 不过，作业在后台运行一样会将结果输出到屏幕上，干扰你的工作。如果放在后台运行<br>的作业会产生大量的输出，最好使用下面的方法把它的输出重定向到某个文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp; command &gt;out.file 2&gt;&amp;1 &amp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，所有的标准输出和错误输出都将被重定向到一个叫做 out.file 的文件中。<br>当你成功地提交进程以后，就会显示出一个进程号，可以用它来监控该进程，或杀死它。<br>3.3.1 向后台提交命令<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在我们运行一个 f i n d命令，查找名为&#8220; s r m . c o n f &#8221;的文件，并把所有标准输出和错误输<br>出重定向到一个叫作 find.dt的文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，在我们成功提交该命令之后，系统给出了它的进程号 27015。<br>&nbsp;&nbsp;&nbsp;&nbsp; 当该作业完成时，按任意键（一般是回车键）就会出现一个提示：<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里还有另外一个例子，有一个叫做 p s 1 的脚本，它能够截断和清除所有的日志文件，我<br>把它放到后台去执行：<br>3.3.2 用ps命令查看进程<br>&nbsp;&nbsp;&nbsp;&nbsp; 当一个命令在后台执行的时候，可以用提交命令时所得到的进程号来监控它的运行。在<br>前面的例子中，我们可以按照提交 ps1 时得到的进程号，用 ps命令和 grep 命令列出这个进程：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果系统不支持 ps x 命令，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; 记住，在用 ps命令列出进程时，它无法确定该进程是运行在前台还是后台。<br>3.3.3 杀死后台进程<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果想杀死后台进程可以使用 k i l l 命令。当一个进程被放到后台运行时， s h e l l 会给出一个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 29<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第3章 后台执行命令<br>&nbsp; 下载<br>进程号，我们可以根据这个进程号，用 kill命令杀死该进程。该命令的基本形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; kill -signal [process_number]<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在暂且不要考虑其中的各种不同信号；我们会在后面的章节对这一问题进行介绍。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在杀进程的时候，执行下面的命令 (你的进程号可能会不同 ) 并按回车键。系统将会给出相<br>应的信息告诉用户进程已经被杀死。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果系统没有给出任何信息，告诉你进程已经被杀死，那么不妨等一会儿，也许系统正<br>在杀该进程，如果还没有回应，就再执行另外一个 kill命令，这次带上一个信号选项：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果用上述方法提交了一个后台进程，那么在退出时该进程将会被终止。为了使后台进<br>程能够在退出后继续运行，可以使用 nohup命令，下面我们就介绍这一命令。<br>3.4 nohup命令<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果你正在运行一个进程，而且你觉得在退出帐户时该进程还不会结束，那么可以使用<br>nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。 Nohup就是不挂起的意思 (no<br>hang up)。<br>&nbsp;&nbsp;&nbsp;&nbsp; 该命令的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; nohup command &amp;<br>3.4.1 使用nohup命令提交作业<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果使用 n o h u p命令提交作业，那么在缺省情况下该作业的所有输出都被重定向到一个名<br>为nohup.out的文件中，除非另外指定了输出文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; nohup command &gt; myout.file 2&gt;&amp;1<br>&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，输出被重定向到 myout.file文件中。<br>&nbsp;&nbsp;&nbsp;&nbsp; 让我们来看一个例子，验证一下在退出帐户后相应的作业是否能够继续运行。我们先提<br>交一个名为 ps1 的日志清除进程：<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在退出该 shell，再重新登录，然后执行下面的命令：<br>&nbsp;&nbsp;&nbsp;&nbsp; 我们看到，该脚本还在运行。如果系统不支持 ps x 命令，使用 ps -ef|grep ps1 命令。<br>3.4.2 一次提交几个作业<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望一次提交几个命令，最好能够把它们写入到一个 s h e l l脚本文件中，并用 n o h u p命<br>令来执行它。例如，下面的所有命令都用管道符号连接在一起；我们可以把这些命令存入一<br>&nbsp; 30&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>个文件，并使该文件可执行。<br>&nbsp;&nbsp; 现在让它可执行：<br>&nbsp;&nbsp; $ chmod 744 quarterend<br>&nbsp;&nbsp; 我们还将该脚本的所有输出都重定向到一个名为 qtr.out的文件中。<br>3.5 小结<br>&nbsp;&nbsp; 本章中所讨论的工具主要是有关后台运行作业的。有时我们必须要对大文件进行大量更<br>改，或执行一些复杂的查找，这些工作最好能够在系统负荷较低时执行。<br>&nbsp;&nbsp; 创建一个定时清理日志文件或完成其他特殊工作的脚本，这样只要提交一次，就可以每<br>天晚上运行，而且无需你干预，只要看看相应的脚本日志就可以了。 C r o n 和其他工具可以使<br>系统管理任务变得更轻松。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96418.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-16 15:05 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/16/96418.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第二章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96367.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 15 Sep 2009 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96367.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96367.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96367.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2章 使用find和xargs<br>&nbsp;&nbsp;&nbsp;&nbsp; 有时可能需要在系统中查找具有某一特征的文件 (例如文件权限、文件属主、文件长度、<br>文件类型等等 ) 。这样做可能有很多原因。可能出于安全性的考虑，或是一般性的系统管理任<br>务，或许只是为了找出一个不知保存在什么地方的文件。 F i n d 是一个非常有效的工具，它可<br>以遍历当前目录甚至于整个文件系统来查找某些文件或目录。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在本章中，我们介绍以下内容：<br>&nbsp;&nbsp;&nbsp;&nbsp; &#8226; find命令选项。<br>&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 使用 find命令不同选项的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp; &#8226; 配合 find使用 x a rg s命令的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp; 由于 find具有如此强大的功能，所以它的选项也很多，其中大部分选项都值得我们花时间<br>来了解一下。即使系统中含有网络文件系统 ( N F S )， f i n d命令在该文件系统中同样有效，只要<br>你具有相应的权限。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在运行一个非常消耗资源的 find 命令时，很多人都倾向于把它放在后台执行，因为遍历一<br>个大的文件系统可能会花费很长的时间 (这里是指 30G字节以上的文件系统 )。<br>&nbsp;&nbsp;&nbsp;&nbsp; Find命令的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; find pathname -options [-print -exec -ok]<br>&nbsp;&nbsp;&nbsp;&nbsp; 让我们来看看该命令的参数：<br>&nbsp;&nbsp;&nbsp;&nbsp; pathname find 命令所查找的目录路径。例如用 .来表示当前目录，用 /来表示系统根目录。<br>&nbsp;&nbsp;&nbsp;&nbsp; -print find 命令将匹配的文件输出到标准输出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; find 命令对匹配的文件执行该参数所给出的 s h e l l命令。相应命令的形式为 ' c o m m -<br>&nbsp;&nbsp;&nbsp;&nbsp; -exec<br>and' {} \; ，注意 {}和\；之间的空格。<br>&nbsp;&nbsp;&nbsp;&nbsp; -ok 和-exec 的作用相同，只不过以一种更为安全的模式来执行该参数所给出的 shell命令，<br>在执行每一个命令之前，都会给出提示，让用户来确定是否执行。<br>2.1 find命令选项<br>&nbsp;&nbsp;&nbsp;&nbsp; f i n d命令有很多选项或表达式，每一个选项前面跟随一个横杠 - 。让我们先来看一下该命<br>令的主要选项，然后再给出一些例子。<br>&nbsp;&nbsp;&nbsp;&nbsp; -name 按照文件名查找文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -perm 按照文件权限来查找文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -prune 使用这一选项可以使 find命令不在当前指定的目录中查找，如果同时使用了 -depth<br>选项，那么 -prune选项将被 find命令忽略。<br>&nbsp;&nbsp;&nbsp;&nbsp; -user 按照文件属主来查找文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -group 按照文件所属的组来查找文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -mtime -n +n 按照文件的更改时间来查找文件， -n表示文件更改时间距现在 n天以内， +n<br>表示文件更改时间距现在 n 天以前。 Find命令还有 -atime 和-ctime选项，但它们都和 -mtime选项<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 15<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2章 使用 find 和xargs<br>&nbsp; 下载<br>相似，所以我们在这里只介绍 -mtime选项。<br>&nbsp;&nbsp;&nbsp;&nbsp; -nogroup 查找无有效所属组的文件，即该文件所属的组在 /etc/groups中不存在。<br>&nbsp;&nbsp;&nbsp;&nbsp; -nouser 查找无有效属主的文件，即该文件的属主在 /etc/passwd中不存在。<br>&nbsp;&nbsp;&nbsp;&nbsp; -newer file1 ! file2 查找更改时间比文件 file1新但比文件 file2旧的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -type 查找某一类型的文件，诸如：<br>&nbsp;&nbsp;&nbsp;&nbsp; b - 块设备文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; d - 目录。<br>&nbsp;&nbsp;&nbsp;&nbsp; c - 字符设备文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; p - 管道文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; l - 符号链接文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; f - 普通文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -size n[c] 查找文件长度为 n块的文件，带有 c时表示文件长度以字节计。<br>&nbsp;&nbsp;&nbsp;&nbsp; -depth 在查找文件时，首先查找当前目录中的文件，然后再在其子目录中查找。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查找位于某一类型文件系统中的文件，这些文件系统类型通常可以在配置文件<br>&nbsp;&nbsp;&nbsp;&nbsp; -fstype<br>/etc/fstab中找到，该配置文件中包含了本系统中有关文件系统的信息。<br>&nbsp;&nbsp;&nbsp;&nbsp; -mount 在查找文件时不跨越文件系统 mount点。<br>&nbsp;&nbsp;&nbsp;&nbsp; -follow 如果 find命令遇到符号链接文件，就跟踪至链接所指向的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; -cpio 对匹配的文件使用 cpio命令，将这些文件备份到磁带设备中。<br>2.1.1 使用name选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 文件名选项是 f i n d命令最常用的选项，要么单独使用该选项，要么和其他选项一起使用。<br>可以使用某种文件名模式来匹配文件，记住要用引号将文件名模式引起来。<br>&nbsp;&nbsp;&nbsp;&nbsp; 不管当前路径是什么，如果想要在自己的根目录 $ H O M E 中查找文件名符合 * . t x t 的文件，<br>使用 ~作为 'pathname 参数，波浪号 ~代表了你的 $HOME目录。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find ~ -name "*.txt" -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 想要在当前目录及子目录中查找所有的&#8216; *.txt&#8217;文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -name "*.txt" -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 想要的当前目录及子目录中查找文件名以一个大写字母开头的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -name "[A-Z]*" -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 想要在 /etc目录中查找文件名以 host开头的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /etc -name "host*" -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 想要查找 $HOME目录中的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ f i n d ~ - n a m e " * " - p r i或t i n d . - p r i n t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nf<br>&nbsp;&nbsp;&nbsp;&nbsp; 要想让系统高负荷运行，就从根目录开始查找所有的文件。如果希望在系统管理员那里<br>保留一个好印象的话，最好在这么做之前考虑清楚！<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find / -name "*" -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果想在当前目录查找文件名以两个小写字母开头，跟着是两个数字，最后是 * . t x t 的文<br>件，下面的命令就能够返回名为 ax37.txt的文件：<br>&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -name "[a-z][a-z][0--9][0--9].txt" -print<br>2.1.2 使用perm选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望按照文件权限模式来查找文件的话，可以采用 - p e r m选项。你可能需要找到所有<br>用户都具有执行权限的文件，或是希望查看某个用户目录下的文件权限类型。在使用这一选<br>项的时候，最好使用八进制的权限表示法。<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在当前目录下查找文件权限位为 7 5 5的文件，即文件属主可以读、写、执行，其他用<br>户可以读、执行的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -perm 755 -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望在当前目录下查找所有用户都可读、写、执行的文件（要小心这种情况）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，我们<br>可以使用 f i n d 命令的 - p e r m 选项。在八进制数字前面要加一个横杠 -。在下面的命令中 - p e r m 代<br>表按照文件权限查找，而&#8216; 007&#8217;和你在 chmod命令的绝对模式中所采用的表示法完全相同。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -perm -007 -print<br>2.1.3 忽略某个目录<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果在查找文件时希望忽略某个目录，因为你知道那个目录中没有你所要查找的文件，<br>那么可以使用 - p r u n e 选项来指出需要忽略的目录。在使用 - p r u n e选项时要当心，因为如果你同<br>时使用了 -depth 选项，那么 -prune选项就会被 find命令忽略。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望在 /apps目录下查找文件，但不希望在 /apps/bin 目录下查找，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /apps -name "/apps/bin" -prune -o -print<br>2.1.4 使用user和nouser选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望按照文件属主查找文件，可以给出相应的用户名。例如，在 $ H O M E目录中查找<br>文件属主为 dave的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find ~ -user dave -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 在/etc目录下查找文件属主为 uucp 的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /etc -user uucp -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了查找属主帐户已经被删除的文件，可以使用 - n o u s e r 选项。这样就能够找到那些属主<br>在 /etc/passwd文件中没有有效帐户的文件。在使用 -nouser选项时，不必给出用户名； find 命令<br>能够为你完成相应的工作。例如，希望在 /home目录下查找所有的这类文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /home -nouser -print<br>2.1.5 使用group和nogroup选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 就像 u s e r和 n o u s e r选项一样，针对文件所属于的用户组， f i n d 命令也具有同样的选项，为<br>了在 /apps 目录下查找属于 accts用户组的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /apps -group accts -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 要查找没有有效所属用户组的所有文件，可以使用 n o g r o u p选项。下面的 f i n d 命令从文件<br>系统的根目录处查找这样的文件<br>&nbsp;&nbsp;&nbsp;&nbsp; $ fine/-nogroup-print<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 17<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2章 使用 find 和xargs<br>&nbsp;下载<br>2.1.6 按照更改时间查找文件<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望按照更改时间来查找文件，可以使用 mtime 选项。如果系统突然没有可用空间了，<br>很有可能某一个文件的长度在此期间增长迅速，这时就可以用 m t i m e选项来查找这样的文件。<br>用减号-来限定更改时间在距今 n日以内的文件，而用加号 +来限定更改时间在距今 n 日以前的<br>文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 希望在系统根目录下查找更改时间在 5日以内的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find / -mtime -5 -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在 /var/adm目录下查找更改时间在 3日以前的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /var/adm -mtime +3 -print<br>2.1.7 查找比某个文件新或旧的文件<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件，可以使用 - n e w e r 选<br>项。它的一般形式为：<br>&nbsp;&nbsp;&nbsp;&nbsp; newest_file_name ! oldest_file_name<br>&nbsp;&nbsp;&nbsp;&nbsp; 其中，！是逻辑非符号。<br>&nbsp;&nbsp;&nbsp;&nbsp; 这里有两个文件，它们的更改时间大约相差两天。<br>&nbsp;&nbsp;&nbsp;&nbsp; 下面给出的 find命令能够查找更改时间比文件 age.awk新但比文件 belts.awk旧的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果想使用 find 命令的这一选项来查找更改时间在两个小时以内的文件，除非有一个现成<br>的文件其更改时间恰好在两个小时以前，否则就没有可用来比较更改时间的文件。为了解决<br>这一问题，可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用 t o u c h<br>命令来实现。<br>&nbsp;&nbsp;&nbsp;&nbsp; 假设现在的时间是 2 3 : 4 0，希望查找更改时间在两个小时以内的文件，可以首先创建这样<br>一个文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; 一个符合要求的文件已经被创建；这里我们假设今天是五月四日，而该文件的更改时间<br>是21:40，比现在刚好早两个小时。<br>&nbsp;&nbsp;&nbsp;&nbsp; 现在我们就可以使用 f i n d命令的 - n e w e r选项在当前目录下查找所有更改时间在两个小时以<br>内的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -newer dstamp -print<br>2.1.8 使用type选项<br>&nbsp;&nbsp;&nbsp;&nbsp; UNIX或LINUX系统中有若干种不同的文件类型，这部分内容我们在前面的章节已经做了<br>&nbsp;&nbsp; 18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>介绍，这里就不再赘述。如果要在 /etc目录下查找所有的目录，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /etc -type d -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在当前目录下查找除目录以外的所有类型的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . ! -type d -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在 /etc目录下查找所有的符号链接文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /etc -type l -print<br>2.1.9 使用size选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 可以按照文件长度来查找文件，这里所指的文件长度既可以用块（ b l o c k）来计量，也可<br>以用字节来计量。以字节计量文件长度的表达形式为 N c ；以块计量文件长度只用数字表示即<br>可。<br>&nbsp;&nbsp;&nbsp;&nbsp; 就我个人而言，我总是使用以字节计的方式，在按照文件长度查找文件时，大多数人都<br>喜欢使用这种以字节表示的文件长度，而不用块的数目来表示，除非是在查看文件系统的大<br>小，因为这时使用块来计量更容易转换。<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在当前目录下查找文件长度大于 1M字节的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -size +1000000c -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在 /home/apache目录下查找文件长度恰好为 100字节的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find /home/apache -size 100c -print<br>&nbsp;&nbsp;&nbsp;&nbsp; 为了在当前目录下查找长度超过 10块的文件（一块等于 512字节）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -size +10 -print<br>2.1.10 使用depth选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 在使用 f i n d 命令时，可能希望先匹配所有的文件，再在子目录中查找。使用 d e p t h 选项就<br>可以使 find 命令这样做。这样做的一个原因就是，当在使用 find命令向磁带上备份文件系统时，<br>希望首先备份所有的文件，其次再备份子目录中的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中， f i n d 命令从文件系统的根目录开始，查找一个名为 C O N . F I L E 的文件。<br>它将首先匹配所有的文件然后再进入子目录中查找。<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find / -name "CON.FILE" -depth -print<br>2.1.11 使用mount选项<br>&nbsp;&nbsp;&nbsp;&nbsp; 在当前的文件系统中查找文件（不进入其他文件系统）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ，可以使用 f i n d命令的 m o u n t 选项。<br>在下面的例子中，我们从当前目录开始查找位于本文件系统中文件名以 XC结尾的文件：<br>&nbsp;&nbsp;&nbsp;&nbsp; $ find . -name "*.XC" -mount -print<br>2.1.12 使用cpio选项<br>&nbsp;&nbsp;&nbsp;&nbsp; c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用 f i n d 命令在整个文件系<br>统中（更多的情况下是在部分文件系统中）查找文件，然后用 cpio命令将其备份到磁带上。<br>&nbsp;&nbsp;&nbsp;&nbsp; 如果希望使用 c p i o 命令备份 / e t c 、 / h o m e和 / a p p s 目录中的文件，可以使用下面所给出的命<br>令，不过要记住你是在文件系统的根目录下：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2章 使用 find 和xargs<br>&nbsp;&nbsp; 下载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （在上面的例子中，第一行末尾的 \告诉 shell命令还未结束，忽略 \后面的回车。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在上面的例子中，应当注意到路径中缺少 / 。这叫作相对路径。之所以使用相对路径，是<br>因为在从磁带中恢复这些文件的时候，可以选择恢复文件的路径。例如，可以将这些文件先<br>恢复到另外一个目录中，对它们进行某些操作后，再恢复到原始目录中。如果在备份时使用<br>了绝对路径，例如 / e t c ，那么在恢复时，就只能恢复到 / e t c 目录中去，别无其他选择。在上面<br>的例子中，我告诉 f i n d命令首先进入 / e t c 目录，然后是 / h o m e 和/ a p p s 目录，先匹配这些目录下<br>的文件，然后再匹配其子目录中的文件，所有这些结果将通过管道传递给 cpio命令进行备份。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 顺便说一下，在上面的例子中 cpio 命令使用了 C65536 选项，我本可以使用 B选项，不过这<br>样每块的大小只有 5 1 2 字节，而使用了 C 6 5 5 3 6 选项后，块的大小变成了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 4 K 字节<br>（65536/1024）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。<br>2.1.13 使用exec或ok来执行shell命令<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当匹配到一些文件以后，可能希望对其进行某些操作，这时就可以使用 - e x e c 选项。一旦<br>f i n d 命令匹配到了相应的文件，就可以用 - e x e c选项中的命令对其进行操作（在有些操作系统<br>中只允许 - e x e c 选项执行诸如 l s或 ls -l 这样的命令）&nbsp;&nbsp; 。大多数用户使用这一选项是为了查找旧文<br>件并删除它们。这里我强烈地建议你在真正执行 r m 命令删除文件之前，最好先用 l s 命令看一<br>下，确认它们是所要删除的文件。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e x e c 选项后面跟随着所要执行的命令，然后是一对儿 { } ，一个空格和一个 \ ，最后是一个<br>分号。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了使用 e x e c选项，必须要同时使用 p r i n t选项。如果验证一下 f i n d 命令，会发现该命令只<br>输出从当前路径起的相对路径及文件名。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了用 ls -l 命令列出所匹配到的文件，可以把 ls -l 命令放在 find命令的 -exec 选项中，例如：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的例子中， find命令匹配到了当前目录下的所有普通文件，并在 -exec选项中使用 ls -l<br>命令将它们列出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了在 /logs目录中查找更改时间在 5日以前的文件并删除它们，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find logs -type f -mtime +5 -exec rm {} \;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记住，在 shell中用任何方式删除文件之前，应当先查看相应的文件，一定要小心！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当使用诸如 mv 或rm命令时，可以使用 -exec选项的安全模式。它将在对每个匹配到的文件<br>进行操作之前提示你。在下面的例子中， f i n d命令在当前目录中查找所有文件名以 . L O G结尾、<br>更改时间在 5日以上的文件，并删除它们，只不过在删除之前先给出提示。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按y键删除文件，按 n键不删除。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何形式的命令都可以在 -exec选项中使用。在下面的例子中我们使用 grep命令。 find命令<br>&nbsp;&nbsp;&nbsp; 20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下载<br>首先匹配所有文件名为&#8220; p a s s w d *&#8221;的文件，例如 p a s s w d 、p a s s w d . o l d 、 p a s s w d . b a k ，然后执<br>行grep命令看看在这些文件中是否存在一个 rounder用户。<br>2.1.14 find命令的例子<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们已经介绍了 find命令的基本选项，下面给出 find命令的一些其他的例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了匹配 $HOME目录下的所有文件，下面两种方法都可以使用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find $HOME -print<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find ~ -print<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了在当前目录中查找 suid置位，文件属主具有读、写、执行权限，并且文件所属组的用<br>户和其他用户具有读和执行的权限的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find . -type f -perm 4755 -print<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了查找系统中所有文件长度为 0的普通文件，并列出它们的完整路径，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find / -type f -size 0 -exec ls -l {} \;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了查找 /var/logs目录中更改时间在 7日以前的普通文件，并删除它们，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find /var/logs -type f -mtime +7 -exec rm {} \;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了查找系统中所有属于 audit组的文件，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $find /-name -group audit -print<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们的一个审计系统每天创建一个审计日志文件。日志文件名的最后含有数字，这样我<br>们一眼就可以看出哪个文件是最新的，哪个是最旧的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A d m i n . l o g 文件编上了序号：<br>a d m i n . l o g . 0 0 1 、 a d m i n . l o g . 0 0 2 等等。下面的 f i n d命令将删除 / l o g s 目录中访问时间在 7 日以前、<br>含有数字后缀的 a d m i n . l o g 文件。该命令只检查三位数字，所以相应日志文件的后缀不要超过<br>999。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '- a t i m<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find /logs -name 'admin.log[0-9][0-9][0-9] e +7 -exec rm {} \;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了查找当前文件系统中的所有目录并排序，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find . -type d -print -local -mount |sort<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了查找系统中所有的 rmt磁带设备，可以用：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find /dev/rmt -print<br>2.2 xargs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在使用 f i n d 命令的 - e x e c 选项处理匹配到的文件时， f i n d命令将所有匹配到的文件一起传递<br>给 e x e c执行。不幸的是，有些系统对能够传递给 e x e c的命令长度有限制，这样在 f i n d 命令运行<br>几分钟之后，就会出现溢出错误。错误信息通常是&#8220;参数列太长&#8221;或&#8220;参数列溢出&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 。这就是<br>x a rg s 命令的用处所在，特别是与 f i n d命令一起使用。 F i n d 命令把匹配到的文件传递给 x a rg s命<br>令，而 x a rg s 命令每次只获取一部分文件而不是全部，不像 - e x e c选项那样。这样它可以先处理<br>最先获取的一部分文件，然后是下一批，并如此继续下去。在有些系统中，使用 - e x e c 选项会<br>为处理每一个匹配到的文件而发起一个相应的进程，并非将匹配到的文件全部作为参数一次<br>执行；这样在有些情况下就会出现进程过多，系统性能下降的问题，因而效率不高；而使用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第2章 使用 find 和xargs<br>&nbsp; 下载<br>x a rg s命令则只有一个进程。另外，在使用 x a rg s命令时，究竟是一次获取所有的参数，还是分<br>批取得参数，以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参<br>数来确定。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们来看看 xargs命令是如何同 find命令一起使用的，并给出一些例子。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的例子查找系统中的每一个普通文件，然后使用 x a rg s 命令来测试它们分别属于哪类<br>文件：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的例子在整个系统中查找内存信息转储文件&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ( c o r e d u m p ) ，然后把结果保存到<br>/tmp/core.log 文件中：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find . -name "core" -print | xargs echo "" &gt;/tmp/core.log<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面的例子在 / a p p s / a u d i t目录下查找所有用户具有读、写和执行权限的文件，并收回相应<br>的写权限：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find /apps/audit -perm -7 -print | xargs chmod o-w<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中，我们用 grep命令在所有的普通文件中搜索 device这个词：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ find / -type f -print | xargs grep "device"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在下面的例子中，我们用 grep命令在当前目录下的所有普通文件中搜索 DBO这个词：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $ f i n d . - n a m e ＊- t y p e f - p r i n t | x a r g s g r e p " D B O "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意，在上面的例子中， \用来取消 find命令中的 *在shell 中的特殊含义。<br>2.3 小结<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f i n d 命令是一个非常优秀的工具，它可以按照用户指定的准则来匹配文件。使用 e x e c 和<br>x a rg s可以使用户对所匹配到的文件执行几乎所有的命令。<br><br><br> <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-15 23:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 经典语录</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96363.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 15 Sep 2009 14:23:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96363.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96363.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96363.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96363.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96363.html</trackback:ping><description><![CDATA[ORZ 作者， 很喜欢作者！<br><br>1 ： &nbsp; 在使用 u m a s k 命令之前一定要弄清楚到底希望具有什么样的文件 / 目录创建缺省权限。否<br>则可能会得到一些非常奇怪的结果；例如，如果将 u m a s k值设置为 6 0 0，那么所创建的文件 /目<br>录的缺省权限就是 066！<br><br>2 ： &nbsp; 要想让系统高负荷运行，就从根目录开始查找所有的文件。如果希望在系统管理员那里<br>保留一个好印象的话，最好在这么做之前考虑清楚！<br>&nbsp; $ find / -name "*" -print<br><br><br>  <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96363.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-15 22:23 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96363.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LINUX AND UNIX SHELL 第一章</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96362.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 15 Sep 2009 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96362.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96362.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96362.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96362.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96362.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第一部分 shell&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96362.html'>阅读全文</a><img src ="http://www.cppblog.com/MemoryGarden/aggbug/96362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-15 22:21 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>self shell 记录</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96212.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Tue, 15 Sep 2009 06:24:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96212.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96212.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96212.html</trackback:ping><description><![CDATA[echo -e 解释\转义字符<br>echo -n 这行不换行。<br>touch filename 创建一个文件<br>vim finlename 创建一个文件<br>&gt;filename 创建一个文件<br>  <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-15 14:24 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/15/96212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>自己用的 linux 命令集合</title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/96020.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sat, 12 Sep 2009 14:31:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/96020.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/96020.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/96020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/96020.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/96020.html</trackback:ping><description><![CDATA[# 自己用的自己记<br><br><br>mv name.type name.type&nbsp; 更改文件名<br><br>rm -rf 删除文件夹<br><br>rpm -ivh *.rpm&nbsp; 安装rpm软件包<br><br><br><br>VIM 操作<br><br>yy 复制一行<br>p 粘贴缓冲区里面的东西<br>u 撤销<br>ctrl + r 撤销撤销<br>dd 删除一行<br>  <img src ="http://www.cppblog.com/MemoryGarden/aggbug/96020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-12 22:31 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/12/96020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的  vim 配置  </title><link>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/95987.html</link><dc:creator>memorygarden</dc:creator><author>memorygarden</author><pubDate>Sat, 12 Sep 2009 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/95987.html</guid><wfw:comment>http://www.cppblog.com/MemoryGarden/comments/95987.html</wfw:comment><comments>http://www.cppblog.com/MemoryGarden/archive/2009/09/12/95987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/MemoryGarden/comments/commentRss/95987.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/MemoryGarden/services/trackbacks/95987.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp; set nu&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2 syntax on<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3 set ruler<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 set incsearch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 set hlsearch<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6 set smartindent<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7 set autoindent<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8 set tabstop=4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9 set guioptions-=T<br>&nbsp;&nbsp;&nbsp;&nbsp; 10 filetype on<br>&nbsp;&nbsp;&nbsp;&nbsp; 11 set vb t_vb=<br>&nbsp;&nbsp;&nbsp;&nbsp; 12 set nohls<br>~&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br><img src ="http://www.cppblog.com/MemoryGarden/aggbug/95987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/MemoryGarden/" target="_blank">memorygarden</a> 2009-09-12 10:58 <a href="http://www.cppblog.com/MemoryGarden/archive/2009/09/12/95987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>