2008年11月19日星期三

Unix体验中心

Unix体验中心(Unix-Center.Net)的目标是为研究、学习和使用各种版本的Unix和类Uni
x操作系统的教师、学生和工程技术人员提供一个体验和测试各种版本的Unix和类Unix系
统的软硬件平台。该平台能够为所有注册用户免费提供如下服务:

-- SSH登录

-- C/C++,Fortran,Java,Ruby,Python,Perl,Common Lisp等多种语言开发工具


-- MySQL数据库服务

-- 在线日历服务

-- 在线课程服务

-- 开放源代码项目托管服务

本站的注册用户可以远程登录进入多个不同的系统,享受该系统上普通用户的所有权限
,学习和使用各种版本的Unix和类Unix操作系统的常用命令和功能。 开发人员更可以将
自己正在开发的应用程序上载到Unix体验中心的服务器,在不同的软硬件平台上编译和
运行,充分体验多处理器、多核、多线程的高性能计算 的乐趣。

本站是一个不以盈利为目的的公益性技术社区。中国是一个发展中国家,我们有很多教
师、学生和工程人员希望能够学习Unix/Linux系统,却又苦于没有合适的环境和条件。
本站存在的目的,就是给这些爱好Unix/Linux的人一个学习和练习的条件,希望您能够
支持我们的行动。

亲爱的同学们,如果你热爱技术,热爱自由,Unix-Center is just what you need! C
ome and join us! Right now!

社区URL:http://www.unix-center.net

2008年11月16日星期日

awk(来自网上)

具体见: 通用线程:Awk 实例,第 2部分

多行记录

正确设置了 FS 变量之后,就可以将 awk 配置成分析几乎任何类型的结构化数据,只要这些数据是每行一个记录。然而,如果要分析占据多行的记录,仅仅依靠设置 FS 是不够的。在这些情况下,我们还需要修改 RS 记录分隔符变量。RS 变量告诉 awk 当前记录什么时候结束,新记录什么时候开始。

譬如,让我们讨论一下如何完成处理“联邦证人保护计划”所涉及人员的地址列表的任务:

Jimmy the Weasel<br />100 Pleasant Drive<br />San Francisco, CA 12345<br />Big Tony<br />200 Incognito Ave.<br />Suburbia, WA 67890<br /></pre></td></tr></tbody></table><br />       <p>理论上,我们希望 awk 将每 3 行看作是一个独立的记录,而不是三个独立的记录。如果 awk 将地址的第一行看作是第一个字段 ($1),街道地址看作是第二个字段 ($2),城市、州和邮政编码看作是第三个字段 $3,那么这个代码就会变得很简单。以下就是我们想要得到的代码: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">BEGIN {<br />    FS="\n"<br />    RS=""<br />}<br /></pre></td></tr></tbody></table><br />       <p>在上面这段代码中,将 FS 设置成 "\n" 告诉 awk 每个字段都占据一行。通过将 RS 设置成 "",还会告诉 awk 每个地址记录都由空白行分隔。一旦 awk 知道是如何格式化输入的,它就可以为我们执行所有分析工作,脚本的其余部分很简单。让我们研究一个完整的脚本,它将分析这个地址列表,并将每个记录打印在一行上,用逗号分隔每个字段。</p>      <br /><a name="N1007E"><b>address.awk</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">BEGIN {<br />    FS="\n"<br />    RS=""<br />}<br />{<br />    print $1 ", " $2 ", " $3<br />}<br /></pre></td></tr></tbody></table><br />       <p>如果这个脚本保存为 address.awk,地址数据存储在文件 address.txt 中,可以通过输入 "awk -f address.awk address.txt" 来执行这个脚本。此代码将产生以下输出: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">Jimmy the Weasel, 100 Pleasant Drive, San Francisco, CA 12345<br />Big Tony, 200 Incognito Ave., Suburbia, WA 67890<br /></pre></td></tr></tbody></table><br />       <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><br /></td><td valign="top" align="right"><br /></td></tr></tbody></table></td></tr></tbody></table><br /><a name="2"><span class="atitle">OFS 和 ORS</span></a>      <p>在 address.awk 的 print 语句中,可以看到 awk 会连接(合并)一行中彼此相邻的字符串。我们使用此功能在同一行上的三个字段之间插入一个逗号和空格 (", ")。这个方法虽然有用,但比较难看。与其在字段间插入 ", " 字符串,倒不如让通过设置一个特殊 awk 变量 OFS,让 awk 完成这件事。请参考下面这个代码片断。 </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">print "Hello", "there", "Jim!"<br /></pre></td></tr></tbody></table><br />       <p>这行代码中的逗号并不是实际文字字符串的一部分。事实上,它们告诉 awk "Hello"、"there" 和 "Jim!" 是单独的字段,并且应该在每个字符串之间打印 OFS 变量。缺省情况下,awk 产生以下输出: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">Hello there Jim!<br /></pre></td></tr></tbody></table><br />       <p>这是缺省情况下的输出结果,OFS 被设置成 " ",单个空格。不过,我们可以方便地重新定义 OFS,这样 awk 将插入我们中意的字段分隔符。以下是原始 address.awk 程序的修订版,它使用 OFS 来输出那些中间的 ", " 字符串:</p>      <br /><a name="N100A6"><b>address.awk 的修订版</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">BEGIN {<br />    FS="\n"<br />    RS=""<br />    OFS=", "<br />}<br />{<br />    print $1, $2, $3<br />}<br /></pre></td></tr></tbody></table><br />       <p>awk 还有一个特殊变量 ORS,全称是“输出记录分隔符”。通过设置缺省为换行 ("\n") 的 OFS,我们可以控制在 print 语句结尾自动打印的字符。缺省 ORS 值会使 awk 在新行中输出每个新的 print 语句。如果想使输出的间隔翻倍,可以将 ORS 设置成 "\n\n"。或者,如果想要用单个空格分隔记录(而不换行),将 ORS 设置成 ""。</p>      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><br /></td><td valign="top" align="right"><br /></td></tr></tbody></table></td></tr></tbody></table><br /><a name="3"><span class="atitle">将多行转换成用 tab 分隔的格式</span></a>      <p>假设我们编写了一个脚本,它将地址列表转换成每个记录一行,且用 tab 定界的格式,以便导入电子表格。使用稍加修改的 address.awk 之后,就可以清楚地看到这个程序只适合于三行的地址。如果 awk 遇到以下地址,将丢掉第四行,并且不打印该行: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">Cousin Vinnie<br />Vinnie's Auto Shop<br />300 City Alley<br />Sosueme, OR 76543<br /></pre></td></tr></tbody></table><br />       <p> 要处理这种情况,代码最好考虑每个字段的记录数量,并依次打印每个记录。现在,代码只打印地址的前三个字段。以下就是我们想要的一些代码:</p>      <br /><a name="N100C3"><b>适合具有任意多字段的地址的 address.awk 版本</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">BEGIN { <br />    FS="\n" <br />    RS="" <br />    ORS="" <br />} <br /> <br />{  <br />        x=1 <br />        while ( x<NF ) { <br />                print $x "\t" <br />                x++ <br />        } <br />        print $NF "\n" <br />} <br /></pre></td></tr></tbody></table><br />       <p>首先,将字段分隔符 FS 设置成 "\n",将记录分隔符 RS 设置成 "",这样 awk 可以象以前一样正确分析多行地址。然后,将输出记录分隔符 ORS 设置成 "",它将使 print 语句在每个调用结尾         <i>不</i> 输出新行。这意味着如果希望任何文本从新的一行开始,那么需要明确写入         <code>print "\n"</code> 。      </p>      <p>在主代码块中,创建了一个变量 x 来存储正在处理的当前字段的编号。起初,它被设置成 1。然后,我们使用 while 循环(一种 awk 循环结构,等同于 C 语言中的 while 循环),对于所有记录(最后一个记录除外)重复打印记录和 tab 字符。最后,打印最后一个记录和换行;此外,由于将 ORS 设置成 "",print 将不输出换行。程序输出如下,这正是我们所期望的:</p>      <br /><a name="N100DA"><b>我们想要的输出。不算漂亮,但用 tab 定界,以便于导入电子表格</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">Jimmy the Weasel        100 Pleasant Drive      San Francisco, CA 12345 <br />Big Tony        200 Incognito Ave.      Suburbia, WA 67890<br />Cousin Vinnie   Vinnie's Auto Shop      300 City Alley  Sosueme, OR 76543<br /></pre></td></tr></tbody></table><br />       <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><br /></td></tr></tbody></table><a name="4"><span class="atitle"><br />循环结构</span></a>      <p>我们已经看到了 awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。它类似于其它语言中的 "repeat...until" 循环。以下是一个示例:</p>      <br /><a name="N100ED"><b>do...while 示例</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">{<br />    count=1<br />    do {<br />        print "I get printed at least once no matter what" <br />    } while ( count != 1 )<br />}<br /></pre></td></tr></tbody></table><br />       <p>与一般的 while 循环不同,由于在代码块之后对条件求值,"do...while" 循环永远都至少执行一次。换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。</p>      <p>        <b>for 循环</b>        <br />awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">for ( initial assignment; comparison; increment ) {<br />    code block<br />}<br /></pre></td></tr></tbody></table><br />       <p>以下是一个简短示例: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">for ( x = 1; x <= 4; x++ ) {<br />    print "iteration",x<br />}<br /></pre></td></tr></tbody></table><br />       <p>此段代码将打印: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">iteration 1<br />iteration 2<br />iteration 3<br />iteration 4<br /></pre></td></tr></tbody></table><br />       <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><br /></td><td valign="top" align="right"><br /></td></tr></tbody></table></td></tr></tbody></table><a name="5"><span class="atitle"><br />break 和 continue</span></a>      <p>此外,如同 C 语言一样,awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断:</p>      <br /><a name="N1011D"><b>while 死循环</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">while (1) {<br />    print "forever and ever..."<br />}<br /></pre></td></tr></tbody></table><br />       <p>while 死循环         <code>1</code> 永远代表是真,这个 while 循环将永远运行下去。以下是一个只执行十次的循环:      </p>      <br /><a name="N1012E"><b>break 语句示例</b></a><br />       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">x=1<br />while(1) {<br />    print "iteration",x<br />    if ( x == 10 ) {<br />        break<br />    }<br />    x++<br />}<br /></pre></td></tr></tbody></table><br />       <p>这里,break 语句用于“逃出”最深层的循环。"break" 使循环立即终止,并继续执行循环代码块后面的语句。</p>      <p>continue 语句补充了 break,其作用如下: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">x=1<br />while (1) {<br />    if ( x == 4 ) {<br />        x++<br />        continue<br />    }<br />    print "iteration",x<br />    if ( x > 20 ) {<br />        break<br />    }<br />    x++<br />}<br /></pre></td></tr></tbody></table><br />       <p>这段代码打印 "iteration 1" 到 "iteration 21","iteration 4" 除外。如果迭代等于 4,则增加 x 并调用 continue 语句,该语句立即使 awk 开始执行下一个循环迭代,而不执行代码块的其余部分。如同 break 一样,continue 语句适合各种 awk 迭代循环。在 for 循环主体中使用时,continue 将使循环控制变量自动增加。以下是一个等价循环: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">for ( x=1; x<=21; x++ ) {<br />    if ( x == 4 ) {<br />        continue<br />    }<br />    print "iteration",x<br />}<br /></pre></td></tr></tbody></table><br />       <p>在 while 循环中时,在调用 continue 之前没有必要增加         <code>x</code> ,因为 for 循环会自动增加         <code>x</code> 。      </p>      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><br /></td><td valign="top" align="right"><br /></td></tr></tbody></table></td></tr></tbody></table><br /><p><a name="6"><span class="atitle">数组</span></a></p>      <p>如果您知道 awk 可以使用数组,您一定会感到高兴。然而,在 awk 中,数组下标通常从 1 开始,而不是 0: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">myarray[1]="jim"<br />myarray[2]=456<br /></pre></td></tr></tbody></table><br />       <p>awk 遇到第一个赋值语句时,它将创建         <code>myarray</code> ,并将元素         <code>myarray[1]</code> 设置成 "jim"。执行了第二个赋值语句后,数组就有两个元素了。      </p>      <p>        <b>数组迭代</b>        <br />定义之后,awk 有一个便利的机制来迭代数组元素,如下所示:      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">for ( x in myarray ) {<br />    print myarray[x]<br />}<br /></pre></td></tr></tbody></table><br />       <p>这段代码将打印数组         <code>myarray</code> 中的每一个元素。当对于 for 使用这种特殊的 "in" 形式时,awk 将         <code>myarray</code>  的每个现有下标依次赋值给         <code>x</code> (循环控制变量),每次赋值以后都循环一次循环代码。虽然这是一个非常方便的 awk 功能,但它有一个缺点 -- 当 awk 在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是:      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">jim<br />456<br /></pre></td></tr></tbody></table><br />       <p>还是 </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">456<br />jim<br /></pre></td></tr></tbody></table><br />       <p>套用 Forrest Gump 的话来说,迭代数组内容就像一盒巧克力 -- 您永远不知道将会得到什么。因此有必要使 awk 数组“字符串化”,我们现在就来研究这个问题。</p>      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><br /><p><a name="7"><span class="atitle">数组下标字符串化</span></a></p>      <p>在我的        <a href="http://www.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html">前一篇文章</a> 中,我演示了 awk 实际上以字符串格式来存储数字值。虽然 awk 要执行必要的转换来完成这项工作,但它却可以使用某些看起来很奇怪的代码:         <br />      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">a="1"<br />b="2"<br />c=a+b+3<br /></pre></td></tr></tbody></table><br />       <p>执行了这段代码后,         <code>c</code> 等于         <code>6</code> 。由于 awk 是“字符串化”的,添加字符串 "1" 和 "2" 在功能上并不比添加数字 1 和 2 难。这两种情况下,awk 都可以成功执行运算。awk 的“字符串化”性质非常可爱 -- 您可能想要知道如果使用数组的字符串下标会发生什么情况。例如,使用以下代码:      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">myarr["1"]="Mr. Whipple"<br />print myarr["1"]<br /></pre></td></tr></tbody></table><br />       <p>可以预料,这段代码将打印 "Mr. Whipple"。但如果去掉第二个 "1" 下标中的引号,情况又会怎样呢? </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">myarr["1"]="Mr. Whipple"<br />print myarr[1]<br /></pre></td></tr></tbody></table><br />       <p>猜想这个代码片断的结果比较难。awk 将         <code>myarr["1"]</code> 和         <code>myarr[1]</code>  看作数组的两个独立元素,还是它们是指同一个元素?答案是它们指的是同一个元素,awk 将打印 "Mr. Whipple",如同第一个代码片断一样。虽然看上去可能有点怪,但 awk 在幕后却一直使用数组的字符串下标!      </p>      <p> 了解了这个奇怪的真相之后,我们中的一些人可能想要执行类似于以下的古怪代码: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">myarr["name"]="Mr. Whipple"<br />print myarr["name"]<br /></pre></td></tr></tbody></table><br />       <p> 这段代码不仅不会产生错误,而且它的功能与前面的示例完全相同,也将打印 "Mr. Whipple"!可以看到,awk 并没有限制我们使用纯整数下标;如果我们愿意,可以使用字符串下标,而且不会产生任何问题。只要我们使用非整数数组下标,如         <code>myarr["name"]</code> ,那么我们就在使用         <i>关联数组</i> 。从技术上讲,如果我们使用字符串下标,awk 的后台操作并没有什么不同(因为即便使用“整数”下标,awk 还是会将它看作是字符串)。但是,应该将它们称作         <i>关联数组</i> -- 它听起来很酷,而且会给您的上司留下印象。字符串化下标是我们的小秘密。;)      </p>      <br /><table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" alt="" height="1" width="100%" /><br /><img alt="" src="http://www.ibm.com/i/c.gif" border="0" height="6" width="8" /></td></tr></tbody></table><table class="no-print" cellpadding="0" cellspacing="0" align="right"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" alt="" height="4" width="100%" /><br /><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td valign="middle"><br /></td><td valign="top" align="right"><br /></td></tr></tbody></table></td></tr></tbody></table><p><a name="8"><span class="atitle">数组工具</span></a></p>      <p>谈到数组时,awk 给予我们许多灵活性。可以使用字符串下标,而且不需要连续的数字序列下标(例如,可以定义         <code>myarr[1]</code> 和         <code>myarr[1000]</code> ,但不定义其它所有元素)。虽然这些都很有用,但在某些情况下,会产生混淆。幸好,awk 提供了一些实用功能有助于使数组变得更易于管理。      </p>      <p>首先,可以删除数组元素。如果想要删除数组         <code>fooarray</code>  的元素         <code>1</code> ,输入:      </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">delete fooarray[1]<br /></pre></td></tr></tbody></table><br />       <p>而且,如果想要查看是否存在某个特定数组元素,可以使用特殊的 "in" 布尔运算符,如下所示: </p>       <table border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td class="code-outline"><pre class="displaycode">if ( 1 in fooarray ) {<br />    print "Ayep!  It's there."<br />} else {<br />    print "Nope!  Can't find it."<br />}<br />

2008年11月13日星期四

解决gnome登录问题

     昨天终于在不经意间把gnome登录问题解决了。我的问题是这样的,每次我选择会话时gnome时,登录时,左上角一个白色长方形,然后就不动了,之前在一个论坛上看到过类似问题的描述,但没有解决。因为自己也装了一个xfce桌面环境,所以可以通过它来登录界面。但是总觉得xfce用的不爽(仅个人意见^_+),想换回到gnome桌面环境。

     当登录gnome时,我通过控制台2,cp .xsession-errors xsession-errors.old 然后换xfce环境(终端操作不是怎么熟悉,没桌面来的直观),打开xsession-errors.old文件,查看错误信息,最后几句如下:
Shutdown failed or nothing to shut down.
/usr/share/themes/Human/gtk-2.0/gtkrc:51: Invalid symbolic color 'metacity_frame_color'
/usr/share/themes/Human/gtk-2.0/gtkrc:51: error: invalid identifier `metacity_frame_color', expected valid identifier
确实是因为之间修改主题是,强制退出的结果,于是我把/usr/share/themes/Human 文件夹下内容用别的主题文件夹下的内容代替,退出xfce,登录gnome,这样可以了,嘻嘻,又可以用gnome了

    哈哈,继续学习。。。

2008年11月10日星期一

ubuntu8.04 amd64 腾讯QQ中文输入解决

    前阵子用QQ都是用pidgin,而且用她同时登录QQ,msn,gtalk和飞信。可是最近老是有人要用QQ传文件,用pidgin好像不可以,显得有点麻烦,于是改用eva,可是传文件老是出错,而且发现特别占内存。老早就知道腾讯已经出台了linux版本的QQ,可惜我装的ubuntu是64位,官方提供的是32位的,装到机器后,不能输入中文,有点恼火,按ubuntu中文论坛一个帖子的三部操作(没用人家附件的im-scim-bridge.so;im-scim.so两个文件)
第一步:
把 32位版(附件):
/usr/lib/gtk-2.0/2.10.0/immodules/ 的

-rw-r--r-- 1 root root 67648 2008-07-31 15:31 im-scim-bridge.so
-rw-r--r-- 1 root root 143588 2008-07-31 15:31 im-scim.so

复制到64位系统下的lib32:
/usr/lib32/gtk-2.0/2.10.0/immodules/


第二步:
cd /etc/gtk-2.0
mv gtk.immodules.32 gtk.immodules.32.bak
/usr/bin/gtk-query-immodules-2.0 > gtk.immodules.32

第三步:
把 gtk.immodules.32 文件里的 /usr/lib/ 替换成 /usr/lib32/

修改后在终端输入qq,出现
(qq:27401): Gtk-WARNING **: /usr/lib32/gtk-2.0/2.10.0/immodules/im-scim-bridge.so: wrong ELF class: ELFCLASS64

(qq:27401): Gtk-WARNING **: Loading IM context type 'scim-bridge' failed

(qq:27401): Gtk-WARNING **: /usr/lib32/gtk-2.0/2.10.0/immodules/im-scim-bridge.so: wrong ELF class: ELFCLASS64

(qq:27401): Gtk-WARNING **: Loading IM context type 'scim-bridge' failed

知道肯定又不能输入中文,于是下载了论坛上附近的那两个文件,问题解决,发几张图,秀一下我的QQ


2008年11月9日星期日

linux下超星pdg阅览器

    刚刚从verycd上下了几个linux的电子书,可惜是超星pdg格式的,google了一下,说有一个叫BooX Viewer的小软件,可惜源里没有,只能下载自己装,里面有个README.txt的文件,说只要./installbxv就可以了,一看installbxv这个文件,原来是个perl脚本,要执行的工作就是在用户目录下向.bash_profile文件中添加两行,可惜,这个在我机器上不好使,我把要添加的两行内容放在了.bashrc文件中,这样就work了哈哈,问题解决,可惜该软件是在命令行下运行的,当然你可以自己手动添加到菜单中。还有一个问题是,我下载的pdg文件用该软件看时,显示不了,一堆乱七八糟的图片。哎,用linux也有利有弊阿。

    一下是那个installbxv文件
#!/usr/bin/perl
########################################################
#    Install Shell for BXViewer
#    2003/3/6 by Momotalo
########################################################

print "Welcome to the install script of \033[1;31mBooX Viewer\033[0m!\n";
$shell=$ENV{'SHELL'};
$isbash=index($shell,"bash");

print "Install for $shell...\n";

$installdir=`pwd`;

if($isbash ne -1)
{
    $cmd1="export LD_LIBRARY_PATH=${installdir}";
    $cmd2="export PATH=\$PATH:${installdir}";

        open (TEST,"+>>$ENV{'HOME'}/.bash_profile")||die "$!\n";
        print TEST  "${cmd1}\n${cmd2}";
        close(TEST);
}

$iscsh=index($shell,"csh");

if($iscsh ne -1)
{
    $cmd1="setenv LD_LIBRARY_PATH ${installdir}";
        $cmd2="setenv PATH \$\{PATH\}:${installdir}";

        open (TEST,"+>>$ENV{'HOME'}/.cshrc.user")||die "$!\n";
        print TEST  "${cmd1}\n${cmd2}";
        close(TEST);

}
print "\033[1;32minstallation complete!\033[0m\n";
print "logout, and login again\ntype \033[1;31m\"bxv\033[0m\" or \033[1;31m\"bxv filename.pdg\033[0m\" to start the program!\n";


2008年11月8日星期六

ubuntu桌面经历

      前天晚上,关机重启ubuntu的时候,登录gnome时,不能正常进入,黄色的背景,左上角出现一个白色的长方形,然后就一直这样,不出现上面的”面板“和下面的“面板”。Google了很久,在论坛上找到了跟我的问题相似的帖子,可是按上面说的,未能解决问题。见帖子地址

      后来偶然间发现通过root登录gnome时没出现上面问题,于是新建了一个用户,用该用户登录时也没有出现问题,出现上面的问题可能是真是上面帖子中说的“删除掉设置主题的临时文件就好了”,可是不知道怎么做,现在还没弄明白。

      我不想通过新建一个新用户来解决这个问题,于是通过的第二个控制台(图形界面不好事,但还有1-6个控制台供你用阿^_+),输入sudo apt-get install xubuntu-desktop装上了KDE桌面环境,然后sudo /etc/init.d/gdm restart 输入用户名/密码,然后点会话选择KDE,这样我就等入了KDE桌面环境,没出现问题。用firefox什么之类的都没问题。原来我的用户目录下的东西都能用。

     然后我又装了xfce桌面环境,卸下KDE (apt-get --purge remove kdelibs4c2 libarts1c2),这下好了,登录xfce时,点Application->settings->settings manager不好使了,而且”也没了桌面“,在桌面上右键不好事,但蹊跷的事,这下能登录gnome了,不过后来又因为我修改gnome的theme然后卡死了,通过sudo /etc/init.d/gdm restart后重新登录又出现白色长方形的问题,现在写这个是在xfce下弄的。

    其实自己也云里雾里的,描述的也飘来飘去,其实本人不追求桌面如何华丽,能用就行,问题嘛,慢慢解决了。

   最后贴上一个我的xfce桌面截图(还是现装的scrot 截的图呢,嘻嘻)

2008年11月2日星期日

2008年哈尔滨的第一场雪

        2008年11月2日,星期日,傍晚十分,天空下起了雪,此时我正跟我们寝的一个人在寝室吃虾和饺子,享受周末的改善晚餐。虾吃的挺爽,可是饺子就一点都不爽,买饺子是个错误的抉择。该吃的还得吃,不过最后剩下很多,实在吃不下去。哎...,也只能这样了。
        现在还在下雪,不过我猜明天估计就化了,毕竟天还不怎么冷!

Powered by ScribeFire.

2008年11月1日星期六

Grep 的一个好用的用法

现在想根据一个文件中的id列表,找出在另一个文件含有该id的相应行,假设有文件a.txt和b.txt,内容如下:
a.txt
--------------------------------------------------
a 1 2
b 3 4
c 4
d 4 5 5
---------------------------
b.txt
------------------------------------------------------
a
c
--------------------------------------------------------------

执行命令grep -Ff b.txt a.txt 轻松搞定
have fun!

Powered by ScribeFire.