﻿<?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++博客-旅途-文章分类-Linux Shell</title><link>http://www.cppblog.com/mydriverc/category/4817.html</link><description>如果想飞得高，就该把地平线忘掉</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:37:17 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:37:17 GMT</pubDate><ttl>60</ttl><item><title>UNIX和LINUX系统的SHELL正则表达式语法</title><link>http://www.cppblog.com/mydriverc/articles/32821.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 24 Sep 2007 16:35:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32821.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32821.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32821.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32821.html</trackback:ping><description><![CDATA[
		<b>UNIX和LINUX系统的SHELL正则表达式语法</b>
		<br />
		<br />一个正则表达式就是由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板，将某个字符模式与所搜索的字符串进行匹配。 <br /><br /><br />
\ <br /><br />
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如，'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 <br /><br /><br />
^ <br /><br />
匹配输入字符串的开始位置。 <br /><br /><br />
$ <br /><br />
匹配输入字符串的结束位置。 <br /><br /><br />
* <br /><br />
匹配前面的子表达式零次或多次。例如，zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 <br /><br /><br />
+ <br /><br />
匹配前面的子表达式一次或多次。例如，'zo+' 能匹配 "zo" 以及 "zoo"，但不能匹配 "z"。+ 等价于 {1,}。 <br /><br /><br />
? <br /><br />
匹配前面的子表达式零次或一次。例如，"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 <br /><br /><br />
{n} <br /><br />
n 是一个非负整数。匹配确定的 n 次。例如，'o{2}' 不能匹配 "Bob" 中的 'o'，但是能匹配 "food" 中的两个 o。 <br /><br /><br />
{n,} <br /><br />
n 是一个非负整数。至少匹配n 次。例如，'o{2,}' 不能匹配 "Bob" 中的 'o'，但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 <br /><br /><br />
{n,m} <br /><br />
m 和 n 均为非负整数，其中n &lt;= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 <br /><br /><br />
? <br /><br />
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m})
后面时，匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串，而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如，对于字符串
"oooo"，'o+?' 将匹配单个 "o"，而 'o+' 将匹配所有 'o'。 <br /><br /><br />
. <br /><br />
匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符，请使用象 '[.\n]' 的模式。 <br /><br /><br />
(pattern) <br /><br />
匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到，在VBScript 中使用 SubMatches
集合，在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符，请使用 '\(' 或
'\)'。 <br /><br /><br />
(?:pattern) <br /><br />
匹配 pattern 但不获取匹配结果，也就是说这是一个非获取匹配，不进行存储供以后使用。这在使用 "或" 字符 (|)
来组合一个模式的各个部分是很有用。例如， 'industr(?:y|ies) 就是一个比 'industry|industries'
更简略的表达式。 <br /><br /><br />
(?=pattern) <br /><br />
正向预查，在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如，
'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ，但不能匹配
"Windows 3.1" 中的
"Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 <br /><br /><br />
(?!pattern) <br /><br />
负向预查，在任何不匹配Negative lookahead matches the search string at any point
where a string not matching pattern
的字符串开始处匹配查找字符串。这是一个非获取匹配，也就是说，该匹配不需要获取供以后使用。例如'Windows
(?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows"，但不能匹配 "Windows 2000"
中的
"Windows"。预查不消耗字符，也就是说，在一个匹配发生后，在最后一次匹配之后立即开始下一次匹配的搜索，而不是从包含预查的字符之后开始。 <br /><br /><br />
x|y <br /><br />
匹配 x 或 y。例如，'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 <br /><br /><br />
[xyz] <br /><br />
字符集合。匹配所包含的任意一个字符。例如， '[abc]' 可以匹配 "plain" 中的 'a'。 <br /><br /><br />
[^xyz] <br /><br />
负值字符集合。匹配未包含的任意字符。例如， '[^abc]' 可以匹配 "plain" 中的'p'。 <br /><br /><br />
[a-z] <br /><br />
字符范围。匹配指定范围内的任意字符。例如，'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 <br /><br /><br />
[^a-z] <br /><br />
负值字符范围。匹配任何不在指定范围内的任意字符。例如，'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 <br /><br /><br />
\b <br /><br />
匹配一个单词边界，也就是指单词和空格间的位置。例如， 'er\b' 可以匹配"never" 中的 'er'，但不能匹配 "verb" 中的 'er'。 <br /><br /><br />
\B <br /><br />
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er'，但不能匹配 "never" 中的 'er'。 <br /><br /><br />
\cx <br /><br />
匹配由x指明的控制字符。例如， \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则，将 c 视为一个原义的 'c' 字符。 <br /><br /><br />
\d <br /><br />
匹配一个数字字符。等价于 [0-9]。 <br /><br /><br />
\D <br /><br />
匹配一个非数字字符。等价于 [^0-9]。 <br /><br /><br />
\f <br /><br />
匹配一个换页符。等价于 \x0c 和 \cL。 <br /><br /><br />
\n <br /><br />
匹配一个换行符。等价于 \x0a 和 \cJ。 <br /><br /><br />
\r <br /><br />
匹配一个回车符。等价于 \x0d 和 \cM。 <br /><br /><br />
\s <br /><br />
匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 <br /><br /><br />
\S <br /><br />
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 <br /><br /><br />
\t <br /><br />
匹配一个制表符。等价于 \x09 和 \cI。 <br /><br /><br />
\v <br /><br />
匹配一个垂直制表符。等价于 \x0b 和 \cK。 <br /><br /><br />
\w <br /><br />
匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 <br /><br /><br />
\W <br /><br />
匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 <br /><br /><br />
\xn <br /><br />
匹配 n，其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如， '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' &amp; "1"。正则表达式中可以使用 ASCII 编码。. <br /><br /><br />
\num <br /><br />
匹配 num，其中 num 是一个正整数。对所获取的匹配的引用。例如，'(.)\1' 匹配两个连续的相同字符。 <br /><br /><br />
\n <br /><br />
标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式，则 n 为后向引用。否则，如果 n 为八进制数字 (0-7)，则 n 为一个八进制转义值。 <br /><br /><br />
\nm <br /><br />
标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式，则 nm
为后向引用。如果 \nm 之前至少有 n 个获取，则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足，若 n 和 m
均为八进制数字 (0-7)，则 \nm 将匹配八进制转义值 nm。 <br /><br /><br />
\nml <br /><br />
如果 n 为八进制数字 (0-3)，且 m 和 l 均为八进制数字 (0-7)，则匹配八进制转义值 nml。 <br /><br /><br />
\un <br /><br />
匹配 n，其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如， \u00A9 匹配版权符号 (?)<img src ="http://www.cppblog.com/mydriverc/aggbug/32821.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-25 00:35 <a href="http://www.cppblog.com/mydriverc/articles/32821.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Linux下正则表达式和grep命令的使用</title><link>http://www.cppblog.com/mydriverc/articles/32820.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 24 Sep 2007 16:34:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32820.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32820.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32820.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32820.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">正规表示法( Regular Exdivssion,RE ) 
</p>
		<p style="text-indent: 2em;">
				<strong>1 什么是正规表示法：</strong>
		</p>
		<p style="text-indent: 2em;">什么是正规表示式 ( Regular Exdivssion, 底下简称 RE ) 呢？</p>
		<div id="w_hzh">
				<script type="text/javascript">
						<!--
google_ad_client = "pub-1572879403720716";
google_ad_width = 300;
google_ad_height = 250;
google_ad_format = "300x250_as";
google_ad_type = "text_image";
google_ad_channel ="0168087865";
google_alternate_ad_url ="http://www.qqread.com/0000js/google300.htm";
google_color_border = "F9FCFE";
google_color_bg = "F9FCFE";
google_color_link = "1F3A87";
google_color_url = "FF6666";
google_color_text = "000000"
google_language = 'zh-CN';
//-->
				</script>
				<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
				</script>
				<iframe name="google_ads_frame" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-1572879403720716&amp;dt=1190651563437&amp;hl=zh-CN&amp;lmt=1189645053&amp;alternate_ad_url=http%3A%2F%2Fwww.qqread.com%2F0000js%2Fgoogle300.htm&amp;format=300x250_as&amp;output=html&amp;correlator=1190651563431&amp;channel=0168087865&amp;url=http%3A%2F%2Fwww.qqread.com%2Flinux%2F2007%2F06%2Fe316093.html&amp;color_bg=F9FCFE&amp;color_text=000000&amp;color_link=1F3A87&amp;color_url=FF6666&amp;color_border=F9FCFE&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.baidu.com%2Fs%3Fwd%3Dlinux%2B%25D5%25FD%25D4%25F2%25B1%25ED%25B4%25EF%25CA%25BD%26lm%3D0%26si%3D%26rn%3D10%26ie%3Dgb2312%26ct%3D0%26cl%3D3%26f%3D1%26rsp%3D0&amp;cc=100&amp;ga_vid=1379700318.1190648406&amp;ga_sid=1190651563&amp;ga_hid=1050670060&amp;ga_fc=true&amp;flash=0&amp;u_h=768&amp;u_w=1024&amp;u_ah=738&amp;u_aw=1024&amp;u_cd=24&amp;u_tz=480&amp;u_his=2&amp;u_java=true&amp;u_nplug=1&amp;u_nmime=1" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" frameborder="0" height="250" scrolling="no" width="300">
				</iframe>
		</div>简单的说，在 <a href="http://www.qqread.com/linux/index.html" target="_blank">Linux</a>  的环境下，我们可以透过『字符串以及一些特殊字符的辅助』来进行文字的比对<div class="left_3" id="artcnt"><nobr id="key0" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,0, this);" onmouseout="kwL(event, this);" onmousemove="kwM(0);">工作</nobr>，好来让使用者筛选自己所需要数据。 
<p style="text-indent: 2em;">这些特殊的字符与搭配使用的工具，就构成了正规表示法的主轴！ 
</p><p style="text-indent: 2em;">例如 /etc/rc.d/init.d 这个目录当中好了，如果你要找到一个文件<nobr id="key4" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,4, this);" onmouseout="kwL(event, this);" onmousemove="kwM(4);">内容</nobr>含有 mail 这个字符串的文件名，要怎么搜寻呢？利用 grep 配合 mail 以及万用字符来搜寻所有的文件名『grep 'mail' /etc/rc.d/init.d/*』 
</p><p style="text-indent: 2em;"><strong>2 正规表示法对于<a href="http://www.qqread.com/keys/system-manage/index.html" target="_blank">系统管理</a>员的用途：</strong></p><p style="text-indent: 2em;">对于系统管理员来说，正规表示法则是一个『不可不学的好东西！』由于系统如果在繁忙的情况之下，每天产生的讯息<nobr id="key3" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,3, this);" onmouseout="kwL(event, this);" onmousemove="kwM(3);">信息</nobr>会
多到你无法想象的地步，而我们也都知道，系统的『错误讯息登录文件』
的内容记载了系统产生的所有讯息，当然，这包含你的系统是否被『入侵』的纪录数据。但是系统的数据量太大了，要系统管理员的
你每天去看这么多的讯息数据，想不疯掉都很难，这个时候，我们就可以透过『正规表示法』的功能，将这些登录的信息进行处理，仅取出『错误』的信息来进行分
析。 </p><p style="text-indent: 2em;"><strong>3 正规表示法的广泛用途：</strong></p><p style="text-indent: 2em;">除了系统管理员之外，一大堆的软件与设定都是支持正规表示法的，最常见的例子就是『邮件<a href="http://www.qqread.com/network/server/index.html" target="_blank">服务器</a>』！您是否有常常收到<a href="http://www.qqread.com/z/mail/safe/index.html" target="_blank">电子邮件</a>里最让人诟病 的『<nobr id="key2" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,2, this);" onmouseout="kwL(event, this);" onmousemove="kwM(2);">广告</nobr>信件』呢？那如果我在 Server 端就将广告信件给剔除的话，客户端就会减少很多不必要的频宽损耗了对吧！那么如何剔除广告信件呢？由于广告信件几乎都有一定的标题或者是内容，因此，只要 每次有来信时，都先将来信的标题与内容进行特殊字符串的比对，<nobr id="key1" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,1, this);" onmouseout="kwL(event, this);" onmousemove="kwM(1);">使用</nobr>正规表示法发现有不良信件就予以剔除！目前两大服务器软件sendmail 与 postfix 都支持正规表示法的比对功能！很多的服务器软件、以及套件都支持正规表示法。 
</p><p style="text-indent: 2em;"><strong>4 grep </strong></p><p style="text-indent: 2em;">语法：[root @test /root ]# grep [-acinv] '搜寻字符串' filenames-list 
</p><p style="text-indent: 2em;">参数说明： 
</p><p style="text-indent: 2em;">-a ：将 binary 文件以 text 文件的方式搜寻数据 
</p><p style="text-indent: 2em;">-c ：计算找到 '搜寻字符串' 的次数 
</p><p style="text-indent: 2em;">-i ：忽略大小写的不同，所以大小写视为相同 
</p><p style="text-indent: 2em;">-n ：顺便输出行号 
</p><p style="text-indent: 2em;">-v ：反向选择，亦即显示出没有 '搜寻字符串' 内容的那一行！ 
</p><p style="text-indent: 2em;">范例： 
</p><p style="text-indent: 2em;">[root @test /root]# grep 'root' /var/log/secure 
</p><p style="text-indent: 2em;">搜索 /var/log/secure 这个文件中包含 root 的行 
</p><p style="text-indent: 2em;">[root @test /root]# grep -v 'root' /var/log/secure 
</p><p style="text-indent: 2em;">搜索没有 root 的行 
</p><p style="text-indent: 2em;">[root @test /root]# grep [A-Z]ANPATH /etc/man.config 
</p><p style="text-indent: 2em;">说明：grep 是一个很常见的指令，最重要的功能就是进行字符串数据的比对了，需要说明的是『grep 在一个文件中查寻一个字符串时，他是以"整行"为单位来数据的撷取的！』 
</p><p style="text-indent: 2em;">grep 是最简单的正规表示法搜寻指令之一，他并不支持一些更严谨的正规表示法内容，不过，已经相当的好用。 
</p><p style="text-indent: 2em;">例题一：找出这个文件里面含有 know 这个字符，并将行号列出来：注意，大小写是不一样的 
</p><p style="text-indent: 2em;">[root @test /root ]# grep -n 'know' regexp.txt 
</p><p style="text-indent: 2em;">例题二：找出这个文件里面含有 * 这个字符，并将行号列出来： 
</p><p style="text-indent: 2em;">[root @test /root ]# grep -n '\*' regexp.txt 
</p><p style="text-indent: 2em;">例题三：我要将所有 know 不论大小写都列出来，并列出行号： 
</p><p style="text-indent: 2em;">[root @test /root]# grep -ni 'know' regexp.txt 
</p><p style="text-indent: 2em;">注意：类似的指令还有egrep、awk、gawk、sed等，将在后面详细说明 
</p><p style="text-indent: 2em;"><strong>5 正规表示法的特殊字符(charaters)与 egrep 指令</strong></p><p style="text-indent: 2em;">特殊字符 表示意义 
</p><p style="text-indent: 2em;">^word 待搜寻的字符在行首 
</p><p style="text-indent: 2em;">word$ 待搜寻的字符在行尾 
</p><p style="text-indent: 2em;">. 匹配任何一个可能的字符 
</p><p style="text-indent: 2em;">\ 跳脱符号将特殊字符变成普通字符 
</p><p style="text-indent: 2em;">? 任何一个『单一』字符 
</p><p style="text-indent: 2em;">* 匹配模式中重复的字符 
</p><p style="text-indent: 2em;">[list] 列表中的字符 
</p><p style="text-indent: 2em;">[range] 列表中范围内的字符 
</p><p style="text-indent: 2em;">[^list] 反向选择，与 [list] 相反 
</p><p style="text-indent: 2em;">[^range] 反向选择，与 [range]相反 
</p><p style="text-indent: 2em;">\{n\} 与前一个相同字浮连续 n 个 
</p><p style="text-indent: 2em;">\{n,m\} 与前一个相同字浮连续 n-m 个 
</p><p style="text-indent: 2em;">请特别留意的是，『正规表示法的特殊字符』与一般在指令列输入指令的『万用字符』并不相同，例如，在万用字符当中， * 代表的是 0 ~ 无限多个字符的意思，但是在正规表示法当中， * 则是重复前一个字符的意思～使用的意义并不相同，不要搞混了！ 
</p><p style="text-indent: 2em;">例题：在 /etc 底下，只要含有 XYZ 三个字符的任何一个字符的那一行就列出来 
</p><p style="text-indent: 2em;">grep [XYZ] /etc/* 
</p><p style="text-indent: 2em;">例题：我想要知道在 /etc 里面，只要句首是 w-z 的就将他印出来？ 
</p><p style="text-indent: 2em;">grep ^[w-z] /etc/* 
</p><p style="text-indent: 2em;"><strong>6 diff比较两个文件内容是否有不一致的指令！</strong></p><p style="text-indent: 2em;">语法：[root @test /root ]# diff file1 file2 
</p><p style="text-indent: 2em;">范例：[root @test /root]# diff index.htm index.html 
</p><p style="text-indent: 2em;">例子：ls –l | grep ‘^d’ 查询子目录 
</p><p style="text-indent: 2em;">注意：使用规则表达式要养成良好的习惯，就是在匹配模式的两端加上‘’。这样和shell的文件通配符号做区别 
</p><p style="text-indent: 2em;"><strong>7 充分规则表达式专用字符</strong></p><p style="text-indent: 2em;">符号 执行 
</p><p style="text-indent: 2em;">pattern1 | pattern2 逻辑或 
</p><p style="text-indent: 2em;">(patten) 对模式进行分组 
</p><p style="text-indent: 2em;">char+ 搜索前面字符的一个或者多个重复实例 
</p><p style="text-indent: 2em;">char? 搜索前面字符的一个或者0个实例 
</p><p style="text-indent: 2em;">例题：t+ 匹配一个或一个以上连续的t，如t tt ttt 
</p><p style="text-indent: 2em;">t? 匹配0个或1个t 如 t 或 ‘ ’ 
</p><p style="text-indent: 2em;">“create | stream “ 和两种模式的任一种进行匹配 
</p><p style="text-indent: 2em;">重点回顾 
</p><p style="text-indent: 2em;">• shell文件匹配字符和规则表达式的区别 
</p><p style="text-indent: 2em;">shell文件匹配字符是用于匹配文件名 
</p><p style="text-indent: 2em;">正规表示法RE的用途主要是用来做为『搜寻』字符串之用，匹配的文件里面的内容和用来过滤特殊讯息等用途； 
</p><p style="text-indent: 2em;">• 由于严谨度的不同，正规表示法之上还有更严谨的延伸正规表示法； 
</p><p style="text-indent: 2em;">• 正规表示法的处理方式，经常是以『整行』或称为『整段』来进行处理的； 
</p><p style="text-indent: 2em;">• grep 与 egrep 在正规表示法里面是很常见的两支程序，其中， egrep 可以用不同的</p></div><img src ="http://www.cppblog.com/mydriverc/aggbug/32820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-25 00:34 <a href="http://www.cppblog.com/mydriverc/articles/32820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>介绍Linux操作系统下杀死进程命令的方法-- ｖｅｒｙ ｇｏｏｄ</title><link>http://www.cppblog.com/mydriverc/articles/32817.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 24 Sep 2007 16:01:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32817.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32817.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32817.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32817.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32817.html</trackback:ping><description><![CDATA[
		<p style="text-indent: 2em;">
				<strong>1. kill </strong>
		</p>
		<div>
				<br />　　作用：根据<a href="http://www.qqread.com/z/windows/process/index.html" target="_blank">进程</a>号杀死进程</div>
		<div> </div>
		<div>　　用法： kill ［信号代码］ 进程ID </div>
		<div> </div>
		<div>　　举例： <br /></div>
		<table style="border-collapse: collapse;" align="center" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
				<tbody>
						<tr>
								<td>
										<p style="margin: 5px; line-height: 150%;">[root@localhost ~]# <nobr id="key1" style="border-bottom: 0px dotted; text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,1, this);" onmouseout="kwL(event, this);" onmousemove="kwM(1);">ps</nobr>
auxf |grep httpd root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep
httpd root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd <a href="http://www.qqread.com/z/apache/index.html" target="_blank">apache</a>
4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd apache 4834
0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd apache 4835 0.0
0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd apache 4836 0.0 0.6
24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd apache 4840 0.0 0.6 24364
4928 ? S 13:02 0:00 \_ /usr/sbin/httpd </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　注意：kill -9 来强制终止退出</p>
		<p>　　举例</p>
		<table style="border-collapse: collapse;" align="center" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
				<tbody>
						<tr>
								<td>
										<p style="margin: 5px; line-height: 150%;">[root@localhost ~]# ps aux
|grep gaim beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim root
5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　或者</p>
		<table style="border-collapse: collapse;" align="center" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
				<tbody>
						<tr>
								<td>
										<p style="margin: 5px; line-height: 150%;">[root@localhost ~]# pgrep -l gaim 5031 gaim </p>
										<p style="margin: 5px; line-height: 150%;">5031 gaim </p>
										<p style="margin: 5px; line-height: 150%;">[root@localhost ~]# kill -9 5031</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<br />　　特殊用法：<br /> <br />　　kill -STOP [pid]</p>
		<p>　　发送SIGSTOP (17,19,23)<nobr id="key3" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,3, this);" onmouseout="kwL(event, this);" onmousemove="kwM(3);">停止</nobr>一个进程，而并不消灭这个进程。</p>
		<p>　　kill -CONT [pid]</p>
		<p>　　发送SIGCONT (19,18,25)重新<nobr id="key0" style="border-bottom: 1px dotted rgb(102, 0, 255); text-decoration: underline; color: rgb(102, 0, 255); background-color: transparent;" onclick="return kwC();" target="_blank" oncontextmenu="return false;" onmouseover="kwE(event,0, this);" onmouseout="kwL(event, this);" onmousemove="kwM(0);">开始</nobr>一个停止的进程。</p>
		<p>　　kill -KILL [pid]</p>
		<p>　　发送SIGKILL (9)强迫进程立即停止，并且不实施清理操作。</p>
		<p>　　kill -9 -1</p>
		<p>　　终止你拥有的全部进程。</p>
		<p>
				<strong>　　2. killall </strong>
		</p>
		<p>　　作用：通过程序的名字，直接杀死所有进程</p>
		<p>　　用法：killall 正在运行的程序名 </p>
		<p>
				<br />　　举例：  </p>
		<table style="border-collapse: collapse;" align="center" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
				<tbody>
						<tr>
								<td>
										<p style="margin: 5px; line-height: 150%;">[root@localhost beinan]# pgrep -l gaim 2979 gaim [root@localhost beinan]# killall gaim </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>　　注意：该命令可以使用 -9 参数来强制杀死进程</p>
		<p>
				<strong>　　3. pkill </strong>
		</p>
		<p>　　作用：通过程序的名字，直接杀死所有进程  </p>
		<p>　　用法：#pkill 正在运行的程序名 </p>
		<p>　　举例： </p>
		<table style="border-collapse: collapse;" align="center" bgcolor="#f1f1f1" border="1" bordercolor="#999999" cellpadding="0" cellspacing="0" width="95%">
				<tbody>
						<tr>
								<td>
										<p style="margin: 5px; line-height: 150%;">[root@localhost beinan]# pgrep -l gaim 2979 gaim [root@localhost beinan]# pkill gaim </p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<strong>　　4. xkill </strong>
		</p>
		<p>　　作用：杀死桌面图形界面的程序。<br /> <br />　　应用情形实例：<a href="http://www.qqread.com/keys/firefox/index.html" target="_blank">firefox</a>出现崩溃不能退出时，点<a href="http://www.qqread.com/keys/shubiao/index.html" target="_blank">鼠标</a>就能杀死firefox 。</p>
		<p>　　当xkill运行时出来和个人脑骨的图标，哪个图形程序崩溃一点就OK了。<br />        如果您想终止xkill ，就按右键取消； </p>
		<p>　　调用方法：</p>
		<p>　　[root@localhost ~]# xkill</p>
<img src ="http://www.cppblog.com/mydriverc/aggbug/32817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-25 00:01 <a href="http://www.cppblog.com/mydriverc/articles/32817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>杀死某个进程</title><link>http://www.cppblog.com/mydriverc/articles/32816.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 24 Sep 2007 15:54:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32816.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32816.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32816.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32816.html</trackback:ping><description><![CDATA[运行了一个QT,但是屏蔽了close事件<br />在shell杀死<br /><br />ps -A<br />根据进程的名子得到ＩＤ<br /><br />kill ID<br /><br /><img src ="http://www.cppblog.com/mydriverc/aggbug/32816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-24 23:54 <a href="http://www.cppblog.com/mydriverc/articles/32816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改变分辨率</title><link>http://www.cppblog.com/mydriverc/articles/32697.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Sat, 22 Sep 2007 18:06:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32697.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32697.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32697.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32697.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32697.html</trackback:ping><description><![CDATA[ 安装VM Tools 系统-&gt;显示然后Ctrl Alt BackSpace重起X服务器.<img src ="http://www.cppblog.com/mydriverc/aggbug/32697.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-23 02:06 <a href="http://www.cppblog.com/mydriverc/articles/32697.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 重起X服务器</title><link>http://www.cppblog.com/mydriverc/articles/32680.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Sat, 22 Sep 2007 10:50:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32680.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32680.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32680.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32680.html</trackback:ping><description><![CDATA[使用Ctrl+Alt+BackSpace.<img src ="http://www.cppblog.com/mydriverc/aggbug/32680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-22 18:50 <a href="http://www.cppblog.com/mydriverc/articles/32680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VM中linux分辨率改变的实现 </title><link>http://www.cppblog.com/mydriverc/articles/32678.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Sat, 22 Sep 2007 10:34:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32678.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32678.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32678.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32678.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32678.html</trackback:ping><description><![CDATA[VM中刚装好的Linux的X介面分辨率只有800*600和一个更低像素的分辨率，想要改变，必须先要装vmware-tools的linux版本。

本文以FC6为例介绍。

1启动VM，进入FC6的root。释放鼠标Alt+Ctrl，选择VM-install vmare tools。

这样，会出现一个挂载的iso文件。如果没有出现，在安装VM的路径中搜找linux就有了，再自己加载了。

2打开这个文件，将里面的文件复制到/root下。

3然后修改/etc/inittal，把里面的id:5:改成id:3，这样再次开机只进入命令符介面。（Vmware-tools相当于虚拟机的显卡驱动了，装这个驱动有时候必须在命令符介面装。）

重启，进入命令符介面。进入root账户。

4找到刚复制的文件，解压tar zxvf *.tar.gz，会生成一个.pl文件，运行这个文件./  vmware-install.pl，一路回车，就可以了。

5 重启，在命令符介面进入账户，输入init 5，直接进入X介面，然后改变“系统”下“显示”的属性，设置显示器类型，以我为例为“LCD panel 1280*1204”，然后改变图形分辨率“1280*1204”

6再次修改/etc/inittal，把里面的id:3:改成id:5，重启就可以了。<img src ="http://www.cppblog.com/mydriverc/aggbug/32678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-22 18:34 <a href="http://www.cppblog.com/mydriverc/articles/32678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>后台执行命令</title><link>http://www.cppblog.com/mydriverc/articles/31985.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 10 Sep 2007 17:12:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/31985.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/31985.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/31985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/31985.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/31985.html</trackback:ping><description><![CDATA[cron 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业，或在一周或一月<br />中的不同时段运行。<br />At at命令。使用它在一个特定的时间运行一些特殊的作业，或在晚一些的非负荷高峰时<br />间段或高峰负荷时间段运行。<br />&amp; 使用它在后台运行一个占用时间不长的进程。<br />Nohup 使用它在后台运行一个命令，即使在用户退出时也不受影响。<br /><br /><br />在考虑向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 />EDITOR=vi; export EDITOR<br />然后保存并退出。<br />如果希望添加、删除或编辑c r o n t a b文件中的条目，而E D I TO R环境变量又设置为v i，那么<br />就可以用v i来编辑c r o n t a b文件，相应的命令为：<br />$ crontab -e<br /><br /><br /><br /><br />杀死后台进程<br />如果想杀死后台进程可以使用k i l l命令。当一个进程被放到后台运行时， s h e l l会给出一个进程号，我们可以根据这个进程号，用k i l l命令杀死该进程。该命令的基本形式为：<br />kill -signal [process_number]<br />在杀进程的时候，执行下面的命令(你的进程号可能会不同)并按回车键。系统将会给出相<br />应的信息告诉用户进程已经被杀死。<br />如果系统没有给出任何信息，告诉你进程已经被杀死，那么不妨等一会儿，也许系统正<br />在杀该进程，如果还没有回应，就再执行另外一个k i l l命令，这次带上一个信号选项：<br /><br /><br />如果用上述方法提交了一个后台进程，那么在退出时该进程将会被终止。为了使后台进<br />程能够在退出后继续运行，可以使用n o h u p命令，<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/31985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-11 01:12 <a href="http://www.cppblog.com/mydriverc/articles/31985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>管道</title><link>http://www.cppblog.com/mydriverc/articles/31984.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 10 Sep 2007 16:57:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/31984.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/31984.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/31984.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/31984.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/31984.html</trackback:ping><description><![CDATA[可以通过管道把一个命令的输出传递给另一个命令作为输入。<br />命令1 |命令2<br />其中|是管道符号。<br /><br />t e e命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出，另一个<br />副本拷贝到相应的文件中。如果希望在看到输出的同时，也将其存入一个文件，那么这个命<br />令再合适不过了。<br />它的一般形式为：<br />tee -a files<br /><br />command &gt; filename 把把标准输出重定向到一个新文件中<br />command &gt;&gt; filename 把把标准输出重定向到一个文件中(追加)<br />command 1 &gt; fielname 把把标准输出重定向到一个文件中<br />command &gt; filename 2&gt;&amp;1 把把标准输出和标准错误一起重定向到一个文件中<br />command 2 &gt; filename 把把标准错误重定向到一个文件中<br />command 2 &gt;&gt; filename 把把标准输出重定向到一个文件中(追加)<br />command &gt;&gt; filename 2&gt;&amp;1 把把标准输出和标准错误一起重定向到一个文件中(追加)<br />command &lt; filename &gt;filename2 把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 />作为标准输出<br />command &lt; filename 把c o m m a n d命令以f i l e n a m e文件作为标准输入<br />command &lt;&lt; delimiter 把从标准输入中读入，直至遇到d e l i m i t e r分界符<br />command &lt;&amp;m 把把文件描述符m作为标准输入<br />command &gt;&amp;m 把把标准输出重定向到文件描述符m中<br />command &lt;&amp;- 把关闭标准输入<br /><br /><br /><img src ="http://www.cppblog.com/mydriverc/aggbug/31984.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-11 00:57 <a href="http://www.cppblog.com/mydriverc/articles/31984.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>重定向〉和〉〉</title><link>http://www.cppblog.com/mydriverc/articles/31983.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 10 Sep 2007 16:51:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/31983.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/31983.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/31983.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/31983.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/31983.html</trackback:ping><description><![CDATA[如果想把一个字符串输出到文件中，使用重定向符号&gt;。在下面的例子中一个字符串被重<br />定向到一个名为m y f i l e的文件中：<br />$ echo "The log files have all been done"&gt; myfile<br />或者可以追加到一个文件的末尾，这意味着不覆盖原有的内容：<br />$ echo "$LOGNAME carried them out at `date`"&gt;&gt;myfile<br /><br />cat 也是这样<br />cat myfile显示文件内容<br />cat &gt; myfile新建文件 输入内容<br />cat &gt;&gt; myfile 将内容输入原来内容后面<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/31983.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-11 00:51 <a href="http://www.cppblog.com/mydriverc/articles/31983.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> rmdir 命令 </title><link>http://www.cppblog.com/mydriverc/articles/29952.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 13 Aug 2007 16:34:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29952.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29952.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29952.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29952.html</trackback:ping><description><![CDATA[
		<a name="66444593">  rm -r 删除目录，不管目录中有没有文件
<br />rm -rf 强制删除，没有提示
<br />一般用到的就这两个，删除文件可以用rm -f，同样是强制删除<br /><br /><span class="zzc"><b>rm命令</b><br /><br />用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录，它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件，只是断开了链接，原文件保持不变。<br /><br />rm命令的一般形式为：<br /><br />rm [选项] 文件… <br /><br />如果没有使用- r选项，则rm不会删除目录。 <br /><br />该命令的各选项含义如下：<br /><br />- f 忽略不存在的文件，从不给出提示。 <br /><br />- r 指示rm将参数中列出的全部目录和子目录均递归地删除。<br /><br />- i 进行交互式删除。 <br /><br />使用rm命令要小心。因为一旦文件被删除，它是不能被恢复的。了防止这种情况的发生，可以使用i选项来逐个确认要删除的文件。如果用户输入y，文件将被删除。如果输入任何其他东西，文件则不会删除。 </span><br /></a>
<img src ="http://www.cppblog.com/mydriverc/aggbug/29952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-08-14 00:34 <a href="http://www.cppblog.com/mydriverc/articles/29952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原来Shell是区分大小写的</title><link>http://www.cppblog.com/mydriverc/articles/29950.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Mon, 13 Aug 2007 16:18:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29950.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29950.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29950.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29950.html</trackback:ping><description><![CDATA[建立了一个QT目录,<br />使用qt是进不去的<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/29950.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-08-14 00:18 <a href="http://www.cppblog.com/mydriverc/articles/29950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux shell下的后台运行以及与前台的转换</title><link>http://www.cppblog.com/mydriverc/articles/29614.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Wed, 08 Aug 2007 16:57:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29614.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29614.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29614.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29614.html</trackback:ping><description><![CDATA[当用bash启动一个程序,你可以用在程序后加&amp;,实现程序在后台运行;<br />例如: emacs &amp;<br />但如果你忘了输入&amp;;但你又不想把程序停止后重新启动;<br />你可以这么做:<br />按Ctrl + Z暂停前台工作,比如前面提到的Emacs;<br />然后用jobs命令查看当前bash一共启动了多少程序,你可以看到你的emacs在其中,<br />它的状态是Stoped的; 并且它的jobID也可以看,比如是2<br />然后用命令bg 2<br />这样你就可以达到和emacs &amp;一样的效果了.<br />当你有些工作比如updatedb, find等需要一定时间,这些工作可以考虑让它在后台<br />运行,而你可以用bash做其它工作<br />如果需要把任务回到前台，只需要fg 2<br /><br />用linux这么久才知道这个技巧，真是汗阿<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/29614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-08-09 00:57 <a href="http://www.cppblog.com/mydriverc/articles/29614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux——Linux后台运行命令详述 </title><link>http://www.cppblog.com/mydriverc/articles/29612.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Wed, 08 Aug 2007 16:55:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29612.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29612.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29612.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29612.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29612.html</trackback:ping><description><![CDATA[
		<span class="postbody">本次主要讲述后台运行命令(crontab,at,&amp;,nohup)及(*,?,[])等 <br /><br />• 设置c r o n t a b文件，并用它来提交作业。 <br />• 使用a t命令来提交作业。 <br />• 在后台提交作业。 <br />• 使用n o h u p命令提交作业。 <br />名词解释： <br />cron：系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业，或在一周或一月中的不同时段运行。 <br />at命令：使用它在一个特定的时间运行一些特殊的作业，或在晚一些的非负荷高峰时间段或高峰负荷时间段运行。 <br />&amp;：使用它在后台运行一个占用时间不长的进程。 <br />nohup：用它在后台运行一个命令，即使在用户退出时也不受影响</span>
		<br />
		<br />
		<span class="postbody">
				<span style="FONT-WEIGHT: bold">1.cron and crontab</span>
				<br />
				<br />c r o n是系统主要的调度进程，可以在无需人工干预的情况下运行作业。c r o n t a b命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个c r o n t a b文件来保存调度信息。可以使用它运行任意一个s h e l l脚本或某个命令，每小时运行一次，或一周三次，这完全取决于你。每一个用户都可以有自己的c r o n t a b文件，但在一个较大的系统中，系统管理员一般会禁止这些文件，而只在整个系统保留一个这样的文件。系统管理员是通过c r o n . d e n y和c r o n . a l l o w这两个文件来禁止或允许用户拥有自己的c r o n t a b文件。 <br /><br />crontab的域 <br /><br />为了能够在特定的时间运行作业，需要了解c r o n t a b文件每个条目中各个域的意义和格式。 <br /><br />下面就是这些域： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />第1列分钟1～5 9 <br />第2列小时1～2 3（0表示子夜） <br />第3列日1～3 1 <br />第4列月1～1 2 <br />第5列星期0～6（0表示星期天） <br />第6列要运行的命令 <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />下面是c r o n t a b的格式： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />分&lt; &gt;时&lt; &gt;日&lt; &gt;月&lt; &gt;星期&lt; &gt;要运行的命令 <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />其中&lt; &gt;表示空格。 <br /><br />c r o n t a b文件的一个条目是从左边读起的，第一列是分，最后一列是要运行的命令，它位于星期的后面。 <br /><br />可以用横杠-来表示一个时间范围，例如你希望星期一至星期五运行某个作业，那么可以在星期域使用1 - 5来表示。 <br />还可以在这些域中使用逗号“,”，例如你希望星期一和星期四运行某个作业，只需要使用1 , 4来表示。 <br />可以用星号*来表示连续的时间段。如果你对某个表示时间的域没有特别的限定，也应该在该域填入*。该文件的每一个条目必须含有5个时间域，而且每个域之间要用空格分隔。 <br />该文件中所有的注释行要在行首用#来表示。 <br /><br /><br /><br />c r o n t a b文件例子： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />30 21* * * /apps/bin/cleanup.sh <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />上面的例子表示每晚的2 1 : 3 0运行/ a p p s / b i n目录下的c l e a n u p . s h。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />45 4 1,10,22 * * /apps/bin/backup.sh <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />上面的例子表示每月1、1 0、2 2日的4 : 4 5运行/ a p p s / b i n目录下的b a c k u p . s h。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />10 1 * * 6,0 /bin/find -name "core" -exec rm {} \; <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />上面的例子表示每周六、周日的1 : 1 0运行一个f i n d命令。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />0,30 18-23 * * * /apps/bin/dbcheck.sh <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />上面的例子表示在每天1 8 : 0 0至2 3 : 0 0之间每隔3 0分钟运行/ a p p s / b i n目录下的d b c h e c k . s h。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />0 23 * * 6 /apps/bin/qtrend.sh <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />上面的例子表示每星期六的11 : 0 0 p m运行/ a p p s / b i n目录下的q t r e n d . s h。 <br /><br />你可能已经注意到上面的例子中，每个命令都给出了绝对路径。当使用c r o n t a b运行s h e l l脚本时，要由用户来给出脚本的绝对路径，设置相应的环境变量。记住，既然是用户向c r o n提交了这些作业，就要向c r o n提供所需的全部环境。不要假定c r o n知道所需要的特殊环境，它其实并不知道。所以你要保证在s h e l l脚本中提供所有必要的路径和环境变量，除了一些自动设置的全局变量。 <br />如果c r o n不能运行相应的脚本，用户将会收到一个邮件说明其中的原因。 <br /><br />c r o n t a b命令的一般形式为： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />crontab [-u user] -e -l -r <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />其中： <br />-u 用户名。 <br />-e 编辑c r o n t a b文件。 <br />-l 列出c r o n t a b文件中的内容。 <br />-r 删除c r o n t a b文件。 <br /><br /><br />如果使用自己的名字登录，就不用使用- u选项，因为在执行c r o n t a b命令时，该命令能够知道当前的用户。 <br /><br /><br />创建一个新的crontab文件 <br /><br />在向c r o n进程提交一个c r o n t a b文件之前，要先设置环境变量E D I TO R.c r o n进程根据它来确定使用哪个编辑器编辑c r o n t a b文件。大部份的U N I X和L I N U X用户都使用v i，如果你也是这样，那么你就编辑$ H O M E目录下的. p r o f i l e文件，在其中加入这样一行： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />EDITOR=vi; export EDITOR <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />然后保存并退出。 <br /><br />创建一个名为&lt; u s e r &gt; c r o n的文件，其中&lt; u s e r &gt;是用户名，例如， samcron。在该文件中加入如下的内容。 <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />#(put your own initials here) echo the date to the console every <br />#15 minutes between 6pm and 6am <br />0,15,30,45 18-06 * * * /bin/echo 'date' &gt; /dev/console <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />保存并退出。确信前面5个域用空格分隔。 <br />在上面的例子中，系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起，从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中，用t t y 1来表示控制台，可以根据实际情况对上面的例子进行相应的修改。 <br />为了提交你刚刚创建的c r o n t a b文件，可以把这个新创建的文件作为c r o n命令的参数： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$su sam <br />crontab samcron <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />为了方便演示，切换到sam用户环境下，然后用crontab samcron提交给c r o n进程，它将每隔1 5分钟运行一次。 <br /><br />同时，新创建文件的一个副本已经被放在/ v a r / s p o o l / c r o n目录中，文件名就是用户名（即sam）。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />#su <br /># cat /var/spool/cron/sam <br /># DO NOT EDIT THIS FILE - edit the master and reinstall. <br /># (samcron installed on Wed Nov 10 21:41:55 2004) <br /># (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) <br />#(put your own initials here) echo the date to the console every <br />#15 minutes between 6pm and 6am <br />0,15,30,45 18-06 * * * /bin/echo 'date' &gt; /dev/console <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />回到root下，查看/var/spool/cron/sam <br /><br />列出crontab文件 <br /><br />为了列出c r o n t a b文件，可以用： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$ crontab -l <br /># DO NOT EDIT THIS FILE - edit the master and reinstall. <br /># (samcron installed on Wed Nov 10 21:41:55 2004) <br /># (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $) <br />#(put your own initials here) echo the date to the console every <br />#15 minutes between 6pm and 6am <br />0,15,30,45 18-06 * * * /bin/echo 'date' &gt; /dev/console <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />你将会看到和上面类似的内容。可以使用这种方法在$ H O M E目录中对c r o n t a b文件做一备份： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$ crontab -l &gt; $HOME/mycron <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />这样，一旦不小心误删了c r o n t a b文件，可以用上一节所讲述的方法迅速恢复。 <br /><br /><br />编辑crontab文件 <br /><br />如果希望添加、删除或编辑c r o n t a b文件中的条目，而E D I TO R环境变量又设置为v i，那么就可以用v i来编辑c r o n t a b文件，相应的命令为： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$ crontab -e <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />可以像使用v i编辑其他任何文件那样修改c r o n t a b文件并退出。如果修改了某些条目或添加了新的条目，那么在保存该文件时， c r o n会对其进行必要的完整性检查。如果其中的某个域出现了超出允许范围的值，它会提示你。 <br />例如，加入下面的一条： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />#DT:delete core files,at 3:30am on 1,7,14,21,26 days of each month <br />30 3 1,7,14,21,26 * * /bin/find -name "core" -exec rm {} \; <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />现在保存并退出。最好在c r o n t a b文件的每一个条目之上加入一条注释，这样就可以知道它的功能、运行时间，更为重要的是，知道这是哪位用户的作业。 <br />现在让我们使用前面讲过的crontab -l命令列出它的全部信息： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />#(put your own initials here) echo the date to the console every <br />#15 minutes between 6pm and 6am <br />0,15,30,45 18-06 * * * /bin/echo 'date' &gt; /dev/console <br /><br />#DT:delete core files,at 3:30am on 1,7,14,21,26 days of each month <br />30 3 1,7,14,21,26 * * /bin/find -name "core" -exec rm {} \; <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />
				<br />删除crontab文件 <br /><br />为了删除c r o n t a b文件，可以用： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$ crontab -r <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />恢复丢失的crontab文件 <br />如果不小心误删了c r o n t a b文件，假设你在自己的$ H O M E目录下还有一个备份，那么可以将其拷贝到/ v a r / s p o o l / c r o n / &lt; u s e r n a m e &gt;，其中&lt; u s e r n a m e &gt;是用户名。如果由于权限问题无法完成拷贝，可以用： <br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<strong>代码:</strong>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />$ crontab &lt;filename&gt; <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />其中，&lt; f i l e n a m e &gt;是你在$ H O M E目录中副本的文件名。 <br />建议在自己的$ H O M E目录中保存一个该文件的副本。编辑副本，然后重新提交新的文件。 <br />有些c r o n t a b的变体有些怪异，所以在使用c r o n t a b命令时要格外小心。如果遗漏了任何选项，c r o n t a b可能会打开一个空文件，或者看起来像是个空文件。这时敲d e l e t e键退出，不要按&lt; C t r l - D &gt;，否则你将丢失c r o n t a b文件。</span>
		<span class="postbody">
				<br />
				<br />
				<br />
				<span class="postbody">
						<span style="FONT-WEIGHT: bold">2.at</span>
						<br />
						<br />a t命令允许用户向c r o n守护进程提交作业，使其在稍后的时间运行。一旦一个作业被提交， a t命令将会保留所有当前的环境变量，包括路径，不象c r o n t a b，只提供缺省的环境。该作业的所有输出都将以电子邮件的形式发送给用户，除非你对其输出进行了重定向，绝大多数情况下是重定向到某个文件中。 <br />和c r o n t a b一样，根用户可以通过/ e t c目录下的a t . a l l o w和a t . d e n y文件来控制哪些用户可以使用a t命令，哪些用户不行。不过一般来说，对a t命令的使用不如对c r o n t a b的使用限制那么严格。 <br /><br /><br />a t命令的基本形式为： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />at [-f script] [-m -l -r] [time] [date] <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />其中， <br />-f：script 是所要提交的脚本或命令。 <br /><br />-l：列出当前所有等待运行的作业。a t q命令具有相同的作用。 <br />-r：清除作业。为了清除某个作业，还要提供相应的作业标识（ I D）；有些U N I X变体只接受a t r m作为清除命令。 <br />-m：作业完成后给用户发邮件。 <br /><br />time：at命令的时间格式非常灵活；可以是H、H H . H H M M、H H : M M或H : M，其中H和M分别是小时和分钟。还可以使用a . m .或p . m .。 <br />date：日期格式可以是月份数或日期数，而且a t命令还能够识别诸如t o d a y、t o m o r r o w这样的词。 <br /><br />使用at命令提交命令或脚本 <br /><br />使用a t命令提交作业有几种不同的形式，可以通过命令行方式，也可以使用a t命令提示符。一般来说在提交若干行的系统命令时，使用a t命令提示符方式，在提交s h e l l脚本时，使用命令行方式。 <br /><br />提示符方式： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />以在a t命令后面跟上日期/时间并回车。然后就进入了a t命令提示符，这时只需逐条输入相应的命令，然后按‘ &lt; C T R L - D &gt;’退出。 <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />命令行方式： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />at [-f script] [-m -l -r] [time] [date] <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />
						<br />例一：提示符方式 <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br /># su sam <br />$ at 10:40 <br />warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh <br />at&gt; find /etc -name "passwd" -print <br />at&gt; &lt;EOT&gt; <br />job 1 at 2004-11-02 10:40 <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />其中， &lt; E O T &gt;就是&lt; C T R L - D &gt;。在10:40系统将执行一个简单的f i n d命令。提交的作业被分配了一个唯一标识job 1。该命令在完成以后会将全部结果以邮件的形式发送给我。 <br /><br />下面这些日期/时间格式都是a t命令可以接受的： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />at 5.00am May23 <br />at 11.20pm <br />at now +2 hour <br />at 9am tomorrow <br />at 15:00 May24 <br />at now + 10 minutes <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />例二：命令行方式 <br />如果希望向a t命令提交一个s h e l l脚本，使用其命令行方式即可。在提交脚本时使用- f选项。 <br />如： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />$ touch db_table.sh <br />$ at 3:00pm tomorrow -f db_table.sh <br />warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh <br />job 3 at 2004-11-02 15:00 <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />在上面的例子中，一个叫做d b _ t a b l e . s h的脚本将在2004-11-02 15:00运行。 <br /><br />还可以使用e c h o命令向a t命令提交作业： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />$ echo find /etc -name "passwd" -print | at now +1 minute <br />warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh <br />job 4 at 2004-11-01 19:07 <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />
						<br />列出所提交的作业 <br />一个作业被提交后，可以使用at -l命令来列出所有的作业： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />$ at -l <br />1       2004-11-02 10:40 a sam <br />3       2004-11-02 15:00 a sam <br />4       2004-11-01 19:07 a sam <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />其中，第一行是作业标识，后面是作业运行的日期/时间。最后一列a代表a t。 <br />还可以使用a t q命令来完成同样的功能，它是a t命令的一个链接。 <br />直接&gt;atq,相当于&gt;at -l <br /><br />当提交一个作业后，它就被拷贝到/ v a r / s p o o l / a t目录中，准备在要求的时间运行。 <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br /># pwd <br />/var/spool/at <br /># ls -l <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />清除一个作业 <br /><br />清除作业的命令格式为： <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />atrm [job no] 或at -r [job no] <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />要清除某个作业，首先要执行at -l命令，以获取相应的作业标识，然后对该作业标识使用at -r 命令，清除该作业。 <br /></span>
				<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
						<tbody>
								<tr>
										<td>
												<span class="genmed">
														<strong>代码:</strong>
												</span>
										</td>
								</tr>
								<tr>
										<td class="code">
												<br />$ at -l <br />1       2004-11-02 10:40 a sam <br />3       2004-11-02 15:00 a sam <br />4       2004-11-01 19:07 a sam <br />$at -r 3 <br />$at -l <br />1       2004-11-02 10:40 a sam <br />4       2004-11-01 19:07 a sam <br /></td>
								</tr>
						</tbody>
				</table>
				<span class="postbody">
						<br />
						<br />
						<br />有些系统使用at-r [job no]命令清除作业。</span>
				<span class="postbody">
						<br />
						<br />
						<br />
						<span class="postbody">
								<span style="FONT-WEIGHT: bold">3.&amp;</span>
								<br />
								<br />当在前台运行某个作业时，终端被该作业占据；而在后台运行作业时，它不会占据终端。可以使用&amp;命令把作业放到后台执行。 <br /><br />该命令的一般形式为： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">命令&amp;</td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />
								<br />
								<br />在后台运行作业时要当心：需要用户交互的命令不要放在后台执行，因为这样你的机器就会在那里傻等。 <br />不过，作业在后台运行一样会将结果输出到屏幕上，干扰你的工作。如果放在后台运行的作业会产生大量的输出，最好使用下面的方法把它的输出重定向到某个文件中： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />command &gt;out.file 2&gt;&amp;1 &amp; <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />
								<br />在上面的例子中，2&gt;&amp;1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 <br />当你成功地提交进程以后，就会显示出一个进程号，可以用它来监控该进程，或杀死它。 <br /><br />例一： <br /><br />查找名为“httpd.conf”的文件，并把所有标准输出和错误输出重定向到f i n d . d t的文件中： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br /># find /etc/httpd/ -name "httpd.conf" -print &gt;find.dt 2&gt;&amp;1 &amp; <br />[2] 7832 <br />[1]   Done                    find /etc/ -name "httpd.conf" -print &gt;find.dt 2&gt;&amp;1 &amp; <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />成功提交该命令之后，系统给出了它的进程号7832。 <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br /># cat find.dt <br />/etc/httpd/conf/httpd.conf <br />[2]+  Done                    find /etc/httpd/ -name "httpd.conf" -print &gt;find.dt 2&gt;&amp;1 &amp; <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />查看find.dt,可以看到执行结果 <br /><br /><br />例二： <br />在后台执行脚本，如：有一个叫psl的脚本 <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />$ps psl &amp; <br />[7878] <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />用ps命令查看进程 <br />用提交命令时所得到的进程号来监控它的运行。用p s命令和g r e p命令列出这个进程： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br /># ps -x |grep 7832 <br />7868 pts/0    S      0:00 grep 7832 <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />
								<br />如果系统不支持ps x命令，可以用： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br /># ps -ef |grep 7832 <br />root      7866  7790  0 23:40 pts/0    00:00:00 grep 7832 <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />在用p s命令列出进程时，它无法确定该进程是运行在前台还是后台。 <br /><br /><br />杀死后台进程 <br /><br />杀死后台进程可以使用k i l l命令。当一个进程被放到后台运行时， s h e l l会给出一个进程号，我们可以根据这个进程号，用k i l l命令杀死该进程。该命令的基本形式为： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />kill -signal [process_number] <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />
								<br />现在暂且不要考虑其中的各种不同信号。 <br />在杀进程的时候，执行下面的命令(你的进程号可能会不同)并按回车键。系统将会给出相应的信息告诉用户进程已经被杀死。 <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />$kill 7832 <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />
								<br />如果系统没有给出任何信息，告诉你进程已经被杀死，那么不妨等一会儿，也许系统正在杀该进程，如果还没有回应，就再执行另外一个k i l l命令，这次带上一个信号选项： <br /></span>
						<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
								<tbody>
										<tr>
												<td>
														<span class="genmed">
																<strong>代码:</strong>
														</span>
												</td>
										</tr>
										<tr>
												<td class="code">
														<br />$kill - 9 7868 <br /></td>
										</tr>
								</tbody>
						</table>
						<span class="postbody">
								<br />如果用上述方法提交了一个后台进程，那么在退出时该进程将会被终止。为了使后台进程能够在退出后继续运行，可以使用n o h u p命令。<br /><br /><span class="postbody"><span style="FONT-WEIGHT: bold">4.nohug</span><br /><br />如果你正在运行一个进程，而且你觉得在退出帐户时该进程还不会结束，那么可以使用n o h u p命令。该命令可以在你退出帐户之后继续运行相应的进程。n o h u p就是不挂起的意思( no hang up)。 <br />该命令的一般形式为： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />nohup command &amp; <br /></td></tr></tbody></table><span class="postbody"><br /><br />使用nohup命令提交作业 <br />如果使用n o h u p命令提交作业，那么在缺省情况下该作业的所有输出都被重定向到一个名为n o h u p . o u t的文件中，除非另外指定了输出文件： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />nohup command &gt; myout.file 2&gt;&amp;1 <br /></td></tr></tbody></table><span class="postbody"><br />在上面的例子中，输出被重定向到m y o u t . f i l e文件中。 <br /><br />让我们来看一个例子，验证一下在退出帐户后相应的作业是否能够继续运行。我们先提交一个名为p s 1的日志清除进程： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$nobup ps1 &amp; <br /></td></tr></tbody></table><span class="postbody"><br />现在退出该s h e l l，再重新登录，然后执行下面的命令： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ps x |grep ps1 <br /></td></tr></tbody></table><span class="postbody"><br /><br />我们看到，该脚本还在运行。如果系统不支持ps x命令，使用ps -ef|grep ps1命令。<br /><br /><span class="postbody"><span style="FONT-WEIGHT: bold">5.一次提交几个作业</span><br /><br />如果希望一次提交几个命令，最好能够把它们写入到一个s h e l l脚本文件中，并用n o h u p命令来执行它。 <br />例如，下面的所有命令都用管道符号连接在一起；我们可以把这些命令存入一个文件，并使该文件可执行。 <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />cat /home/accounts/qrt_0499 | /apps/bin/trials.awk | sort | lp <br />$cat &gt; quarterend <br />cat /home/accounts/qtr_0499 | /apps/bin/trials.awk | sort | lp <br />&lt;ctrl-D&gt; <br /></td></tr></tbody></table><span class="postbody"><br /><br />现在让它可执行： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ chmod 744 quarterend <br /></td></tr></tbody></table><span class="postbody"><br /><br />我们还将该脚本的所有输出都重定向到一个名为q t r. o u t的文件中。 <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />nobup ./quarterend &gt; qtr.out 2&gt; <br /></td></tr></tbody></table><span class="postbody"><br /><br />后台运行作业的: <br />有时我们必须要对大文件进行大量更改，或执行一些复杂的查找，这些工作最好能够在系统负荷较低时执行。 <br />创建一个定时清理日志文件或完成其他特殊工作的脚本，这样只要提交一次，就可以每天晚上运行，而且无需你干预，只要看看相应的脚本日志就可以了。c r o n和其他工具可以使系统管理任务变得更轻松。</span><span class="postbody"><br /><br /><br /><span class="postbody"><span style="FONT-WEIGHT: bold">6.*，？，[...]，[!...]等</span><br /><br /><br />• 匹配文件名中的任何字符串。 <br />• 匹配文件名中的单个字符。 <br />• 匹配文件名中的字母或数字字符。 <br /><br /><br />下面就是这些特殊字符： <br /><br />* 匹配文件名中的任何字符串，包括空字符串。 <br />？ 匹配文件名中的任何单个字符。 <br />[...] 匹配[ ]中所包含的任何字符。 <br />[!...] 匹配[ ]中非感叹号！之后的字符。 <br /><br /><br />当s h e l l遇到上述字符时，就会把它们当作特殊字符，而不是文件名中的普通字符，这样用户就可以用它们来匹配相应的文件名。 <br /><br />a、*：使用星号*可以匹配文件名中的任何字符串。就不用多说了，和win下差不多 <br />b、？：使用可以匹配文件名中的任何单个字符。和win差不多 <br />c、[]：使用[ . . . ]可以用来匹配方括号[ ]中的任何字符。可以使用一个横杠-来连接两个字母或数字，以此来表示一个范围。 <br /><br />1)列出以i或o开头的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />#ls [io]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />2)列出log.开头、后面跟随一个数字、然后可以是任意字符串的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />#ls log.[0-9]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />3)与例二相反，列出log.开头、后面不跟随一个数字、然后可以是任意字符串的文件名 <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />#ls log.[!0-9]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />4)列出所有以LPS开头、中间可以是任何两个字符，最后以1结尾的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />#ls LPS??1 <br /></td></tr></tbody></table><span class="postbody"><br /><br />5)列出所有以大写字母开头的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ ls [A-Z]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />6)列出所有以小写字母开头的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ ls [a-z]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />7)为了列出所有以数字开头的文件名： <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ ls [0-9]* <br /></td></tr></tbody></table><span class="postbody"><br /><br />8)列出所有以. 开头的文件名（隐含文件，例如. p r o f i l e、. r h o s t s、. h i s t o r y等）: <br /></span><table cellspacing="1" cellpadding="3" width="90%" align="center" border="0"><tbody><tr><td><span class="genmed"><strong>代码:</strong></span></td></tr><tr><td class="code"><br />$ ls .* <br /></td></tr></tbody></table></span></span></span>
				</span>
		</span>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1456841</p>
<img src ="http://www.cppblog.com/mydriverc/aggbug/29612.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-08-09 00:55 <a href="http://www.cppblog.com/mydriverc/articles/29612.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>time后面跟其他命令可以查看该命令所用的时间</title><link>http://www.cppblog.com/mydriverc/articles/29108.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Tue, 31 Jul 2007 16:00:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29108.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29108.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29108.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29108.html</trackback:ping><description><![CDATA[time ./zz (自己编的程序)<br />time ls<br />time ps<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/29108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-08-01 00:00 <a href="http://www.cppblog.com/mydriverc/articles/29108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在命令后面加上个"&amp;" 会显示这个命令的进程号</title><link>http://www.cppblog.com/mydriverc/articles/29107.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Tue, 31 Jul 2007 15:50:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/29107.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/29107.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/29107.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/29107.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/29107.html</trackback:ping><description><![CDATA[在命令后面加上个"&amp;" 会显示这个命令的进程号<br /><br />如ls&amp;<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/29107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-07-31 23:50 <a href="http://www.cppblog.com/mydriverc/articles/29107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>