2007年1月31日

无常

今日一位老邻居过世了。

父亲告诉我的时候我还真不敢相信,因为我一开始还以为是那一位患病多年的老人终于解脱了,可是万万没有想到是这位高大魁梧、豁达开朗的69岁的老人。

真是没有想到啊,前几天还看到他,身强体壮,能从3楼拎着煤球炉子到楼下,生完火再拎回去。而且还能骑上自行车去大包小包的买东西,前几天还看到他在办年货。

他有两个孙子,一个12岁,一个7岁,很懂事的,老人家对孩子也是疼爱有加,天天接送幼儿园的。

而且他也挺喜欢我们儿子的,经常逗孩子玩,孩子也跟他挺熟。我们也跟他家相处多年,也非常融洽和睦。

听说老人家是突然之间的感冒导致了肺炎,送医院2天时间就过世了。好好的一个人,一下子说没有就没有了。不过往好的方面说,还算没有受到痛苦。

天有不测风云,人有旦夕祸福。

只能感慨世事无常啊!

呜呼!

阅读全文...

2007年1月30日

备份LFS

为了让好不容易做好的LFS可以再恢复,直接用tar打包。

备份: # tar cjpf lfs.tar.bz2 /mnt/lfs
恢复: # tar jxpf lfs.tar.bz2

(加上p参数为了保留权限。)

阅读全文...

2007年1月29日

EMACS的一个超强的扩展

看看在哪里——



阅读全文...

2007年1月28日

女人别在男人面前谈的十个话题

相爱是激情,相处是亲情,其中的学问小心真需要好好修炼一下自己的"情商"看看下面的文章,虽然不是说100%正确,用来参考一下提高"等级"也不错:

1、千万别当面批评他的母亲,这样会伤害他的感情。动不动就“你妈怎么着……”、“我比你妈强多了”的妻子让丈夫望而生畏,要记住,永远不要想表现得比他妈还贤惠。

2、不要对他的“浪漫观点”加以揶揄,这会伤害他的自尊心。

3、不要把他的饮食习惯或不良嗜好作为话题公开谈论。他向你倾诉的事,并非要你广告街坊、朋友,男性最忌伴侣在朋友面前经常提及他的“秘密”,尤其是他的坏习惯。不过,你不妨在别人面前称赞一下他的优点,例如工作出色,衣着品位高,厨艺十分精湛,他必定会高兴。

4、不要对比他的缺点来夸奖另一位男士,他会感到被看不起和被奚落。男性通常对同性缺乏安全感,若你提及与别的男士的优点来和他作比较,可能会令他忐忑不安。因此尽量少拿丈夫跟别的男人做比较,应让他觉得自己比其他男人优秀。

5、看见漂亮女人,他如果多看两眼,你如果冷嘲热讽,他会极不高兴。每个男人都喜欢美女,不管他嘴上承不承认。聪明的女人会这样鞭策男友,主动指着接上的一个美女问男友:她漂亮不?(千万别问,她比我漂亮不?切记!!)矫正效果会比全智贤那套更好。

6、不要没完没了地劝他争取升官加薪或“跳槽”。很显然,有这种想法的女人往往有很强的虚荣心,所谓“夫荣妻贵”;此外,她们往往还有很强的依附心理,所谓“只有藤缠树,哪有树缠藤”。为了满足她们的虚荣心和依赖性,她们不惜给丈夫施加各种压力。当然,鼓励丈夫发奋图强并没有错,但是,如果不根据实际情况,制造压力,可能会适得其反。

7、不要谈及男士在家庭中担任什么“角色”,因为他在潜意识中仍认为搞家务有损男性“大丈夫”的尊严。

8、不要谈他的“秃顶”,这会让他心生恐惧感,生怕在女性眼中失去吸引力。

9、不要谈论他的“腰围”。

10、不要追问他“私房钱”的用途之类的事。男人不仅需要私房钱来消费烟酒,更需要足够的活动经费来满足日常的应酬;私房钱,已不仅仅预示着男女平等,更是精神危机下的物质依托。两个人的互相尊重是保持爱情和婚姻美好的基础,这种尊重不但要放在心里,更要表现在语言上,尊重即是信任,如同想捧起一手细沙,捏得太紧往往会从指缝中漏掉,轻轻的托起才能使之圆满。

阅读全文...

2007年1月27日

小孩已经认识数字了

目前儿子能识别三个数字了:

2
7
8

所谓的能识别,就是我拿出这三个数字,他能正确的读出来;而且我报出这三个音,他能从全部数字中找出来。并且成功率在100%(排除心不在焉的情况)。

特此记录儿子的进步。

阅读全文...

2007年1月26日

一篇比较全的gnus编码介绍文章

Gnus 是构建在 Emacs 之上的,自然也就利用了 Emacs 超强的多国语言编码支持。所以如果你有一封乱码的邮件,如果 Gnus 看不了的话,那么估计卖糕的也不会有办法了。

为了处理各种编码的邮件,gnus 提供了很多可以设置的变量。不过变量多了也会带来麻烦,如果你设置不好的话,就有可能开枪打中自己的脚。

** 先谈谈邮件编码

邮件可以分为两个部分: header 和 body。比较文明的邮件会在 header 的`Content-Type' 这一行中用 MIME 说明邮件采用了什么编码。而不文明的邮件则缺少这种说明,对于只有英文的邮件,这样做不会有问题,而对于包含中文的邮件,就有可能这是导致乱码,小比尔的 Outlook Express 就喜欢发出这种邮件,一些webmail 也经常干这种事。

另外,在邮件头中,还可以指定邮件的传输编码。如果邮件的内容都是7位的us-ascii字符,就不会出现什么传输编码的问题,但是因为汉字的编码一般都是8位的,而有些邮件网关只能传输7bit字符,最高位作其它用途了,所以就出现了base64, quoted-printable 等把8位字符转换成7位编码进行传输的编码方案。邮件的传输编码可以在邮件头中用 `Content-Transfer-Encoding' 指出来。

我们可以让 Gnus 把 `Content-Type' 和 `Content-Transfer-Encoding' 字段显示出来:

(add-hook 'gnus-startup-hook
'(lambda ()
(setq gnus-visible-headers "^\\(^To:\\|^CC:\\|^From:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^X-Newsreader:\\|^User-Agent:\\|^X-Mailer:\\|Line:\\|Lines:\\|Content-Type:\\|NNTP-Posting-Host\\)")

这样我们就可以看到邮件采用了什么编码(顺便还可以看到对方用的是什么客户端软件),如果邮件指定了编码,你就会在邮件头部看到这一行:

Content-Type: text/plain; charset=GB18030

如果邮件指定了传输编码,就可以看到这样一行:

Content-Transfer-Encoding: base64

** Gnus 中与编码有关的变量

需要说明的是,大多数情况下,邮件都是比较文明的,在 Content-Type 字段已经说明了邮件采用的编码,那么 Gnus 将自动按指定的编码显示邮件。除非 Emacs 本身就不支持这种编码,否则是不会出现乱码的。

一个常见情况就是使用 Emacs21 或 Emacs22,而不安装 mule-gbk,要知道Emacs21/22 本身就不支持 GBK 和GB18030,这样对于 charset=gbk, 或charset=gb18030 的邮件出现乱码就不奇怪了。所以,如果你使用的是 Emacs21 或Emacs22, 赶紧去下载 mule-gbk 装上吧。注意,对于 Emacs22,mule-gbk 的设置中一定要加上这一句:

(utf-translate-cjk-load-tables)

否则 Emacs22 无法进行 gbk <--> utf-8 的转换,而 gnus 是先用 utf-8 编写邮件,再转换成指定的编码发出去,如果不加上这句设置,就会出现只能发 utf-8的邮件,不能发 gbk 邮件的怪现象。

下面讨论的设置适用于 Emacs22+mule-gbk 和 Emacs23。

如果邮件中已经用 Content-Type 和 Content-Transfer-Encoding 指定了编码,那么 gnus 将忠实地采用这些编码处理邮件,这时是不应该出现乱码的。所以,我们所做的设置基本上都是为了对付那些捣乱的,不指明编码的邮件。

现在我们来看看 gnus 中与编码设置有关的变量。这些变量可以分为两种类型,一种是与邮件内容有关的,另一种是与组名(group name)有关的。

** 与邮件内容有关的变量

*** gnus-default-charset

这个变量指定查看邮件所用编码的默认值(对于未指定编码的邮件)。但是这个变量的会被下一个变量(gnus-group-charset-alist)覆盖。如果不设置这个变量,它的值将由 `current-language-environment' 确定。

例如:(setq gnus-default-charset 'gbk)

*** gnus-group-charset-alist

这个变量根据组名确定本组的默认编码。设置这个变量时我们要给出一个(regexp charset) 对,其中 regexp 时匹配组名的正则表达式,charset 是指定的编码。在这个变量的默认设置中,我们可以查到如下内容:

("\\(^\\|:\\)hk\\>\\|\\(^\\|:\\)tw\\>\\|\\" cn-big5)
("\\(^\\|:\\)cn\\>\\|\\" cn-gb-2312)

可以看出,对于以 hk 或 tw 开头(或者组名中包含 :hk 或 :tw)的组,采用big5编码。而对于以 cn 开头或组名中包含 :cn 的组采用 cn-gb-2312 的编码。

因为现在 gbk 比 gb2312 应用更广泛,所以我们需要更改这个变量的设置:

(add-to-list 'gnus-group-charset-alist '("\\(^\\|:\\)cn\\>\\|\\" gbk))

这个变量也可以在 group parameter 中以 (charset . gbk) 的方式指定。

*** gnus-summary-show-article-charset-alist

有时候,默认的编码还不能解决问题,例如,有人把 big5 编码的邮件投递到了 cn 开头的组里,而且邮件头中又没有编码设定(插一句,这些邮件一般都是垃圾邮件),这时就需要手工指定编码。

(setq gnus-summary-show-article-charset-alist '((1 . utf-8) (2 . big5) (3 . gbk) (4 . utf-7)))

进行了这种设定以后,我们看到乱码邮件时就可以用 `1 g' 指定采用 utf-8,`2 g' 指定big5等等,不过能不能正确解码就要看你自己猜的对不对了。

** 与组名有关的变量

我们订阅新闻组时,可以看到有些服务器上的组名都是英文的,比如在`news.cn99.com' 这个服务器中组名都是这样的:

gnu.emacs.help
cn.comp.os.linux
tw.bbs.os.linux

而有些服务器的组名却是包含中文的,比如新帆`news.newsfan.net'的组名:

计算机.软件.操作系统.FreeBSD
计算机.软件.操作系统.linux
休闲娱乐.游戏天地.Diablo

下面两个变量是为了让gnus能正确地处理非ascii组名的。

*** gnus-group-name-charset-group-alist

这个变量根据组名确定组名采用的编码,默认值是`((".*" utf-8))',也就是默认用 utf-8 处理所有组名。我们可以这样这样设置:

(setq gnus-group-name-charset-group-alist '(("\\.com\\.cn:" . gbk) ("news\\.newsfan\\.net" . gbk)))

这样所有组名中含有 .com.cn 或 news.newsfan.net 的组,其名称都采用 gbk解码。

不过如果我们把 news.newsfan.net 设置为 native method, 那么组名中就不会出现 news.newsfan.net,那么这个变量就发挥不了作用,怎么办呢?可以采用下面这个变量。

*** gnus-group-name-charset-method-alist

还记得吗?我们选择新闻服务器时是怎么设定的?对了,我们是通过设置method 来选择服务器的,比如:

(setq gnus-select-method '(nntp "news.newsfan.net"))
(setq gnus-secondary-select-methods '((nnml "")))

这个变量可以根据我们选择的 method,为来自这个 method 的组设置组名的编码。

(setq gnus-group-name-charset-method-alist '(((nntp "news.newsfan.net") . gbk)))

这样,所有来自新帆服务器的组名都采用gbk来解码。

** 设置发出邮件的编码: mm-coding-system-priorities

当我们向外发送邮件时,也可以指定编码,比如我们希望发出的邮件采用gb2312编码,就可以这样设置:

(setq mm-coding-system-priorities '(iso-8859-1 gb2312 utf-8))

这样,gnus将先试这采用 iso-8859-1 编码邮件,如果不行就采用 gb2312,实在不行再采用 utf-8 编码。

这样如果你写了一封纯英文的信件,将会采用 iso-8859-1 发出;如果你写了一封中文信件,但其中的汉字都在 gb2312 的范围内,则采用gb2312发出;如果你的信件中含有gb2312以外的字符,则会被以utf-8编码发出。

那么如果想对不同的组采用不同的编码发信,有办法实现吗?可以,通过设置posting-style 就可以实现。

(setq gnus-posting-styles '((".*"
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 utf-8))))
("^cn\\.comp";
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 gb2312 utf-8))))
("^tw\\.comp"
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 big5 utf-8))))))

这样对于 cn.comp 开头的组,gnus会先尝试采用gb2312发送邮件,不行再用utf-8,而对于 tw.comp 开头的组,会先尝试采用big5发送邮件,不行再用utf-8。

** 处理有问题的邮件: gnus-newsgroup-ignored-charsets

有些客户端发出的邮件没有指定正确的MIME类型,例如本来这封邮件是用 gbk 编码的,但是 MIME 类型却设置成了 x-gbk:

Content-Type: text/plain; charset=x-gbk

这时gnus解码时会遇到困难,我们可以把这种 MIME 类型加入到gnus-newsgroup-ignored-charsets 列表中,让 gnus 采用默认的编码处理它。

再比如,有些邮件的 MIME 类型是 charset=gb18030, 对于 emacs23,这是没问题的,因为 Emacs23 支持 gb18030 编码。但是 emacs22+mule-gbk 根本就不支持gb18030,那么该怎么办呢?同样我们可以把 gb18030 加入gnus-newsgroup-ignored-charsets 列表中:

(setq gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown x-gbk gb18030))

ignored-charsets 也可以在 group parameters 中这样指定:

(ignored-charsets x-unknown iso-8859-1)

** 指定传输编码:gnus-group-posting-charset-alist

这个变量可以用来设置邮件头中的 Content-Transfer-Encoding 字段,为邮件指定传输编码。这个变量的默认值已经设置的很好了,我从来没有遇到需要设置这个变量的情况。

** 不要让自己发出乱码的邮件(指定附件文件名和subject的编码方式)

gnus 默认采用 RFC2231 对附件文件名进行编码,有些 MUA 无法识别这种编码。现在比较流行的方式是采用 RFC2047 对附件文件名进行编码。可以采用如下设定,让gnus 也采用这种方式对文件名进行编码:

(defalias 'mail-header-encode-parameter 'rfc2047-encode-parameter)

有很多差劲的邮件客户端无法解码 quoted-printable 编码(看到过 subject 中有很多 `=' 号的乱码邮件吗?就是由于这个原因产生的。)为了保证我们发出的邮件subject 采用 base64 编码,而不是采用quoted-printable 编码,最好加上这两句:

(add-to-list 'rfc2047-charset-encoding-alist '(gbk . B))
(add-to-list 'rfc2047-charset-encoding-alist '(gb18030 . B))

** 参考设置

最后给出一个参考设置吧,适用于 Emacs22+mule-gbk 或者 Emacs23:

(setq gnus-default-charset 'gbk)
(add-to-list 'gnus-group-charset-alist '("\\(^\\|:\\)cn\\>\\|\\" gbk))
(setq gnus-summary-show-article-charset-alist '((1 . utf-8) (2 . big5) (3 . gbk) (4 . utf-7)))
(setq gnus-group-name-charset-group-alist '(("\\.com\\.cn:" . gbk) ("news\\.newsfan\\.net" . gbk)))
(setq gnus-group-name-charset-method-alist '(((nntp "news.newsfan.net") . gbk)))
(setq gnus-newsgroup-ignored-charsets '(unknown-8bit x-unknown x-gbk gb18030))

(defalias 'mail-header-encode-parameter 'rfc2047-encode-parameter)
(add-to-list 'rfc2047-charset-encoding-alist '(gbk . B))
(add-to-list 'rfc2047-charset-encoding-alist '(gb18030 . B))

(setq gnus-posting-styles '((".*"
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 utf-8))))
("^cn\\.comp";
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 gb2312 utf-8))))
("^tw\\.comp"
(name "xxx")
(address "xxx@xxx.xxx")
(eval (setq mm-coding-system-priorities '(iso-8859-1 big5 utf-8))))))

(add-hook 'gnus-startup-hook
'(lambda ()
(setq gnus-visible-headers "^\\(^To:\\|^CC:\\|^From:\\|^Subject:\\|^Date:\\|^Followup-To:\\|^X-Newsreader:\\|^User-Agent:\\|^X-Mailer:\\|Line:\\|Lines:\\|Content-Type:\\|NNTP-Posting-Host\\)")

因为这篇文章主要是讨论Gnus的编码问题,所以这里列出的仅仅是与编码有关的设置。

阅读全文...

2007年1月25日

Emacs Calendar 的一些按键

在calendar配置完成后,如何来使用呢?

在calendar上,常用的命令如下:
. 跳回当前天
o 跳到某一个月
g d 跳到某年某月某日
g c 跳到某年某星期的星期几
g C 跳到阴历的某一天
pC 显示当前的阴历日期
h 显示当前节日
i d 加入当前这一天的日程安排
i w 加入每周这一天的日程安排
i m 加入每月这一天的日程安排
i y 加入每年这一天的日程安排
i a 加入周年纪念(anniversary),比如生日等
d 察看当前日期的diary

其它一些比较好玩的功能:
S 让emacs能计算日出日落的时间
pC 显示阴历

阅读全文...

2007年1月24日

学做香喷喷的土豆饼

看得眼馋:

原料之一:培根

切成丝

原料二:土豆,切成细丝

把培根和土豆丝翻炒一下,稍微放点盐

原料三:一个鸡蛋+面粉+黑胡椒粉

把培根和土豆丝翻炒一下,稍微放点盐

放入油锅中煎炸

差不多这个成色就可以了


给张特写

阅读全文...

2007年1月23日

备份与压缩命令

  用户经常需要备份计算机系统中的数据,为了节省存储空间,常常将备份文件进行压缩。下面分别介绍备份与压缩的命令。


  tar命令

  tar可以为文件和目录创建档案。利用tar,用户可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。tar最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案,如软盘。利用tar命令,可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。Linux上的tar是GNU版本的。

  语法:tar [主选项+辅选项] 文件或者目录

  使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用。

  主选项:

  c 创建新的档案文件。如果用户想备份一个目录或是一些文件,就要选择这个选项。

  r 把要存档的文件追加到档案文件的未尾。例如用户已经作好备份文件,又发现还有一个目录或是一些文件忘记备份了,这时可以使用该选项,将忘记的目录或文件追加到备份文件中。

  t 列出档案文件的内容,查看已经备份了哪些文件。

  u 更新文件。就是说,用新增的文件取代原备份文件,如果在备份文件中找不到要更新的文件,则把它追加到备份文件的最后。

  x 从档案文件中释放文件。

  辅助选项:

  b 该选项是为磁带机设定的。其后跟一数字,用来说明区块的大小,系统预设值为20(20*512 bytes)。

  f 使用档案文件或设备,这个选项通常是必选的。

  k 保存已经存在的文件。例如我们把某个文件还原,在还原的过程中,遇到相同的文件,不会进行覆盖。

  m 在还原文件时,把所有文件的修改时间设定为现在。

  M 创建多卷的档案文件,以便在几个磁盘中存放。

  v 详细报告tar处理的文件信息。如无此选项,tar不报告文件信息。

  w 每一步都要求确认。

  z 用gzip来压缩/解压缩文件,加上该选项后可以将档案文件进行压缩,但还原时也一定要使用该选项进行解压缩。

  例1:把/home目录下包括它的子目录全部做备份文件,备份文件名为usr.tar。

  $ tar cvf usr.tar /home

  例2:把/home目录下包括它的子目录全部做备份文件,并进行压缩,备份文件名为usr.tar.gz 。

  $ tar czvf usr.tar.gz /home

  例3:把usr.tar.gz这个备份文件还原并解压缩。

  $ tar xzvf usr.tar.gz

  例4:查看usr.tar备份文件的内容,并以分屏方式显示在显示器上。

  $ tar tvf usr.tar | more

  要将文件备份到一个特定的设备,只需把设备名作为备份文件名。

  例5:用户在/dev/fd0设备的软盘中创建一个备份文件,并将/home 目录中所有的文件都拷贝到备份文件中。

  $ tar cf /dev/fd0 /home

  要恢复设备磁盘中的文件,可使用xf选项:

  $ tar xf /dev/fd0

  如果用户备份的文件大小超过设备可用的存贮空间,如软盘,您可以创建一个多卷的tar备份文件。M选项指示tar命令提示您使用一个新的存贮设备,当使用M选项向一个软驱进行存档时,tar命令在一张软盘已满的时候会提醒您再放入一张新的软盘。这样您就可以把tar档案存入几张磁盘中。

  $ tar cMf /dev/fd0 /home

  要恢复几张盘中的档案,只要将第一张放入软驱,然后输入有x和M选项的tar命令。在必要时您会被提醒放入另外一张软盘。

  $ tar xMf /dev/fd0

  gzip命令

  减少文件大小有两个明显的好处,一是可以减少存储空间,二是通过网络传输文件时,可以减少传输的时间。gzip是在Linux系统中经常使用的一个对文件进行压缩和解压缩的命令,既方便又好用。

  语法:gzip [选项] 压缩(解压缩)的文件名

  各选项的含义:

  -c 将输出写到标准输出上,并保留原有文件。

  -d 将压缩文件解压。

  -l 对每个压缩文件,显示下列字段:

  压缩文件的大小

  未压缩文件的大小

  压缩比

  未压缩文件的名字

  -r 递归式地查找指定目录并压缩其中的所有文件或者是解压缩。

  -t 测试,检查压缩文件是否完整。

  -v 对每一个压缩和解压的文件,显示文件名和压缩比。

  -num 用指定的数字num调整压缩的速度,-1或--fast表示最快压缩方法(低压缩比),-9或--best表示最慢压缩方法(高压缩比)。系统缺省值为6。

  假设一个目录/home下有文件mm.txt、sort.txt、xx.com。

  例1:把/home目录下的每个文件压缩成.gz文件。

  $ cd /home

  $ gzip *

  $ ls

  m.txt.gz sort.txt.gz xx.com.gz

  例2:把例1中每个压缩的文件解压,并列出详细的信息。

  $ gzip -dv *

  mm.txt.gz 43.1%-----replaced with mm.txt

  sort.txt.gz 43.1%-----replaced with sort.txt

  xx.com.gz 43.1%-----replaced with xx.com

  $ ls

  mm.txt sort.txt xx.com


  例3:详细显示例1中每个压缩的文件的信息,并不解压。

  $ gzip -l *

  compressed uncompr. ratio uncompressed_name

  277 445 43.1% mm.txt

  278 445 43.1% sort.txt

  277 445 43.1% xx.com

  $ ls

  mm.txt.gz sort.txt.gz xx.com.gz

  例4:压缩一个tar备份文件,如usr.tar,此时压缩文件的扩展名为.tar.gz

  $ gzip usr.tar

  $ ls

  usr.tar.gz

  unzip命令

  用MS Windows下的压缩软件winzip压缩的文件如何在Linux系统下展开呢?可以用unzip命令,该命令用于解扩展名为.zip的压缩文件。

  语法:unzip [选项] 压缩文件名.zip

  各选项的含义分别为:

  -x 文件列表 解压缩文件,但不包括指定的file文件。

  -v 查看压缩文件目录,但不解压。

  -t 测试文件有无损坏,但不解压。

  -d 目录 把压缩文件解到指定目录下。

  -z 只显示压缩文件的注解。

  -n 不覆盖已经存在的文件。

  -o 覆盖已存在的文件且不要求用户确认。

  -j 不重建文档的目录结构,把所有文件解压到同一目录下。

  例1:将压缩文件text.zip在当前目录下解压缩。

  $ unzip text.zip

  例2:将压缩文件text.zip在指定目录/tmp下解压缩,如果已有相同的文件存在,要求unzip命令不覆盖原先的文件。

  $ unzip -n text.zip -d /tmp

  例3:查看压缩文件目录,但不解压。

  $ unzip -v text.zip

  zgrep命令

  这个命令的功能是在压缩文件中寻找匹配的正则表达式,用法和grep命令一样,只不过操作的对象是压缩文件。如果用户想看看在某个压缩文件中有没有某一句话,便可用zgrep命令。

阅读全文...

2007年1月22日

饿了不能吃的11种食品

  饥不择食”,是说人饿的时候,食欲强烈。但是如果抓到什么吃什么,急于填饱肚子对健康是非常有害的,因为有些食物是不宜空腹食用的,否则会给你的健康埋下隐患。

  牛奶、豆浆

  这两种食物中含有大量的蛋白质,空腹饮用,蛋白质将“被迫”转化为热能消耗掉,起不到营养滋补作用。正确的饮用方法是与点心、面饼等含面粉的食品同食,或餐后两小时再喝,或睡前喝均可。

  酸奶

  空腹饮用酸奶,会使酸奶的保健作用减弱,而饭后两小时饮用,或睡前喝,既有滋补保健、促进消化作用,又有排气通便作用。

  白酒

  空腹饮酒会刺激胃黏膜,久之易引起胃炎、胃溃疡等疾病。另外,人空腹时,本身血糖就低,此时饮酒,人体很快出现低血糖,脑组织会因缺乏葡萄糖的供应而发生功能性障碍,出现头晕、心悸、出冷汗及饥饿感,严重者会发生低血糖昏迷。

  茶

  空腹饮茶能稀释胃液,降低消化功能,还会引起“茶醉”,表现为心慌、头晕、头痛、乏力、站立不稳等。

  糖

  糖是一种极易消化吸收的食品,空腹大量吃糖,人体短时间内不能分泌足够的胰岛素来维持血糖的正常值,使血液中的血糖骤然升高容易导致眼疾。而且糖属酸性食品,空腹吃糖还会破坏机体内的酸碱平衡和各种微生物的平衡,对健康不利。

  柿子、西红柿

  含有较多的果胶、单宁酸,上述物质与胃酸发生化学反应生成难以溶解的凝胶块,易形成胃结石。

  香蕉

  香蕉中有较多的镁元素,空腹吃香蕉会使人体中的镁骤然升高而破坏人体血液中的镁钙平衡,对心血管产生抑制作用,不利于身体健康。

  山楂、桔子

  含有大量的有机酸、果酸、山楂酸、枸橼酸等,空腹食用,会使胃酸猛增,对胃黏膜造成不良刺激,使胃胀满、嗳气、吐酸水。

  大蒜

  大蒜含有强烈辛辣味的大蒜素,空腹食蒜,会对胃黏膜、肠壁造成强烈的刺激,引起胃肠痉挛、绞痛。

  白薯

  白薯中含有单宁和胶质,会刺激胃壁分泌更多胃酸,引起烧心等不适感。

  冷饮

  空腹状态下暴饮各种冷冻食品,会刺激胃肠发生挛缩,久之将导致各种酶促化学反应失调,诱发肠胃疾病。

阅读全文...

2007年1月21日

Bash提示符-PS1

bash 有两级用户提示符。第一级是你经常看到的 bash 在等待命令输入时的提示符。缺省的一级提示符是字符$(如果是超级用户,则是#号)。
你可以通过改变bash 的PS1变量的值来改变你的缺省提示符,例如:
PS1="Please enter a command"
把bash shell 的提示符该为指定的字符串。

当bash 期待输入更多的信息以完成命令时显示第二级提示符。缺省的第二级提示符是 >。 果你要改变第二级提示符,可以通过设置PS2变量的值来实现:
PS2="I need more information"
另外你还可以用特殊的字符来定义你的提示符,下面的列表列出了最常用的特殊字符。

提示符特殊字符代码
字符 含义
\! 显示该命令的历史记录编号。
\# 显示当前命令的命令编号。

\$ 显示$符作为提示符,如果用户是root的话,则显示#号。
\\ 显示反斜杠。

\d 显示当前日期。

\h 显示主机名。

\n 打印新行。
\nnn 显示nnn的八进制值。

\s 显示当前运行的shell的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径。

这些特殊字符能组合成很多种有用的提示符方案(也可以组合为很奇异的方案),例如把 PS1 设为:
PS1="\t"
这导致提示符显示当前的时间,就象下面的显示一样(提示符后面将不会有空格):
02:16:15

而下面的设置:
PS1=\t
将导致提示符变成下面的样子:
t
这显示了设置中引号的重要性,下面的提示符串:
PS1="\t\\ "
会使提示符看起来象这个样子:
02:16:30\
这种情况下,提示符后面会有一个空格,因为引号里有一个空格。

阅读全文...

2007年1月20日

Emacs 基本编辑键列表

写在前面
`C-' Control-(即 Ctrl-),按住 Ctrl 键再按其他键
`M-' Meta-(或 Alt-),按住 Alt 键再按其他键;或按一下 ESC,再按其他键
`C-M-' Control-Alt-,按住 Ctrl 和 Alt 两个键再按其他键
point 位点:文档中的一个位置,一般是光标的左下角
mark 标记:由命令设置,用来定义/保存文档中的位置信息
region 区域:在 mark 和 point 之间部分,称为一个 region
RET 回车键
TAB 制表符键
ESC ESC 键
SPC 空格键
Backspace, DEL 退格键
Delete 删除键


C-x C-c 退出并关闭 Emacs

C-z 挂起 Emacs (大多数的shell可以用fg返回,少部分用exit返回)
C-x C-z 退出并挂起 Emacs

C-x C-f 打开文件/目录
C-x i 插入文件内容
C-x C-r 只读方式打开一个文件

C-x u Undo( 想要Redo,动一下光标或按一下 C-g 再Undo :)
C-x C-s 保存文件
C-x s 询问保存所有未存盘文件
C-x C-w 文件另存为…

C-l 刷新窗口,并将当前行移至窗口中心。给定参数,可以设置当前行的位置,不妨试试 M-0 C-l 或 M-- C-l 或 M-4 C-l

C-g 退出当前命令。如果你不知道Emacs正在干什么呢,多按几次C-g,就会恢复到正常状态

在线帮助
C-h t TUTORIAL
C-h i Online Info

C-h c 给出键序列(简称键)绑定的命令名字
C-h w 由命令名字给出键的绑定

给命令传参数
C-u 给定参数前缀

M-0
...
M-9 参数0...9

M-- 负参数

光标的移动
C-a 行首
C-e 行尾

C-n 下一行
C-p 上一行
C-f 前进一个字符
C-b 后退一个字符

M-f 前进一个词
M-b 后退一个词

搜索和替换
C-s 增量搜索
C-r 向后增量搜索

M-x search-forward 搜索
M-x search-backward 向后搜索

C-M-s
M-x isearch-forward-regexp 正则表达式增量搜索
C-M-r
M-x isearch-backward-regexp 正则表达式向后增量搜索

M-x search-forward-regexp 正则表达式搜索
M-x search-backward-regexp 正则表达式向后搜索

ESC % 询问替换
M-x query-replace-regexp 正则表达式询问替换

M-x replace-string 替换
M-x replace-regexp 正则表达式替换

区域的拷贝和粘贴

区域是Mark和Point之间的部分,Point就是光标的左下角,Mark由命令设置。 `Yanking ring'是一个存放文本的地方,从这里你可以拷贝删除(kill)的文本。 `Yanking'表示插入刚刚删除(kill)的文本。

C-SPC
C-@
M-x set-mark-command 设置 mark
C-x C-x 交换 mark 和 point

C-w 将区域的文本删除,并放入yanking ring中
M-w 复制区域到yanking ring中

C-y 将yanking ring中最后一个区域插入当前缓冲区

M-y 按一次C-y后,多次按M-y,则用yanking ring中的其他区域替换刚刚插入的区域

C-o 在光标后面插入空行
C-x C-o 将光标附近的空行去掉,多行的时候,第一次只剩一行,第二次全部删除

C-d 删除一个字符(不能yank)
M-d 删除光标附近的一个词

C-x h 将整个缓冲区设置为区域(缓冲区尾是mark,首是point)

C-k 删除(kill)从光标处到行尾

基本编辑
C-q 插入下一个的字符,比如插入字符`^X'用“C-q C-x”

C-t 交换两个字符
M-t 交换两个词
C-x C-t 交换两行

C-x = 显示光标所在字符的信息

C-v 向下滚动窗口
M-v 向上滚动窗口

多窗口和多缓冲区
C-x b 转到另一个缓冲区
C-x k 删除缓冲区

C-x 2 水平分个窗口
C-x 3 垂直分割窗口
C-x 1 去掉其它窗口
ESC ESC ESC 同上
C-x 0 去掉当前窗口

C-x o 光标到另一个窗口中

C-M-v 向下滚动另一个窗口,给一个负的参数,则向上滚动


C-x ( 开始一个宏的定义
C-x ) 结束一个宏的定义

C-x e 执行宏

M-x name-last-kbd-macro 给最后一个宏命名

M-x insert-kbd-macro 在当前文件中插入一个已定义并命名过的宏

矩形区域操作
* 矩形区域的两端是由 Mark 和 Point 确定的。

C-x r t 用串填充矩形区域
C-x r o 插入空白的矩形区域
C-x r y 插入之前删除的矩形区域
C-x r k 删除矩形区域
C-x r c 将当前矩形区域清空

阅读全文...

2007年1月19日

如今的四大恶心

尽管现在的广大人民群众都什么事情都已经麻木,比如车祸现场的围观,跳楼现场对轻生者的怂恿等等,但依然有不少人保留着一些些的感觉,那就是恶心。连麻木的人都感到恶心,那就是真的恶心了。

一 领导发言

之所以把这一条放在第一位,是因为敝人还对这些所谓的领导们有一些的尊敬在里面(我也够恶心的),毕竟,领导是第一位的。当年克拉玛依大火的时候,不是有人高呼着“让领导先走”的口号,成功的保护了我们这些尊敬的领导的生命,为祖国的建设保留了火种,几百名小学师生并在烈火中永生了。扯远了,领导们的讲话可以用黄易的小说名字来总结就是:破!碎!虚!空!听起来挺有气势的不是吗?我等小民一听到领导的讲话,自然是两股战战,受宠若惊了。

任何领导的讲话都是重要的,都需要我们认认真真地记录下来这些宝贵的材料和英明的指导。不过翻开这些记录的领导名言,再笨的人用脚趾头都能看出些门道,那就是领导的讲话好有规律,好有章法,有板有眼,掷地有声。再听听领导们千篇一律富有磁性的声音,简直帅呆了,“奉天承运,皇帝诏曰”,不是,是“同志们,今天这个会很好…”,这个“好”字要拉着长声讲出来,还有带些动作,你干什么呢?就知道你要学,你别学了,你不是领导,怎么能学得来?看人家在台上,抑扬顿挫,高低起伏,振聋发聩,举手投足,手舞足蹈,慷慨激昂,岂不悦乎?其余音绕梁,三日不绝,闻者无不欣欣然,三月不知饭味也。

呕吐物:家常便饭


二 商家炒作

前几年,满城的大街小巷还遍布着牛皮癣和性病的小广告,各种功效罗列的一清二楚,各种症状都说得头头是道。反观现在的商家炒作,地厂开发商给我们描绘了一幅幅如同伊甸园般的蓝图,罗马建筑、欧式风格、近水别墅、交通便利、森林公园,能不让人眼馋吗?到头来,开发商指着附近一条臭水沟告诉你什么叫近水别墅,指着十里外的一个公车站告诉你什么叫交通便利,指着小区里刚种植的几个树苗告诉你什么叫森林公园。游戏开发商告诉你惊心动魄的国战其实就是无聊的砍人,告诉你绚丽的技能系统其实就是都是千篇一律打马虎眼,告诉你含有深厚历史文化底蕴其实就是把几个古人扔在游戏里,无聊的时候和你说几句话。更让人受不了的个人认为是婚姻介绍所,其炒作的功力已经到了须仰视才见的地步。用炉火纯青已经不能形容他的高深莫测,让人目瞪口呆之余,更多的是让人狂吐不已。是个男人就是有房有车,MBA背景,年轻有为,外企白领甚至公司总裁,是个女人就是貌美年轻,身材姣好,温柔贤惠,知书达理。仿佛一夜之间,中国的所有精英们都变成了单身男女,曲高和寡,找不到对象。仿佛一夜之间,中国的所谓精英们,如同雨后春笋般展现在普罗大众面前,看得我等草民惭愧得恨不得找个地缝钻进去,看来结了婚的男人都是些社会的渣滓,IQ低的可怜,一身的破衣烂衫,而结了婚的女人个个如同东施,体态肥硕,粗野暴力,更加有碍市容。呜呼,通过婚介的操作,中国都变成什么社会了?凡是有男才女貌的全都打着光棍,凡是一般智商姿色平庸的都结了婚。

呕吐物:满腹酸水


三 明星广告

上面说了商家的炒作,在配合上所谓明星广告的推波助澜,更加让人的肠胃中波涛汹涌,不吐不快。每年网友都评出十大恶心广告,我在这里就不叙述这些内容了。从明星的广告中,我们其实还是可以了解很多的八卦的,这也给喜欢明星八卦的人找到了空子。

赵小姐爱用什么样牌子的卫生巾,蒋大妈的孩子爱喝什么牌子的牛奶,国足的英雄们爱喝什么样的啤酒,李小妹的婚姻仿佛也是通过喝了什么而更加甜蜜。大爷们不是骨质疏松,就是前列腺炎,大娘不是冠心病,就是要酸背痛,少妇们不是月经不调,就是性生活不和谐,男人们不是酒色过度,就是应酬太多,孩子们不是缺锌缺钙,就是发育不良。总之人人有病,整个成了东亚病夫了。

呕吐物:苦胆汁


四 专家意见

我考,我写到这里的时候,我都快吐的坚持不住了。特别是写下专家两个字,更是吐的一蹋糊涂。不知从何时起,中国大地上忽然冒出了很多的专家学者。从伊拉克战争的评论到天气异常的反应,从经济建设的进展到奇怪物种的发现,到处都闪烁着专家们高大光辉的身影,到处多弥漫着专家们知识渊博料事如神的气息,到处都传颂着专家们大智若愚一针见血的评论。

举个例子来说,这两天总在网上看见说国内的某个地方又发现类似太岁的东西。然后结尾告诉我们专家们正在做鉴定,鉴定的结果呢?统统都是一句什么菌类什么体(具体忘了),操,这个结论李时珍的时候就得出来了,就差那个时候李时珍没听到过菌这个名词了,现在的一帮专家们还能够站在前人的肩膀上,凭借着比前人先进几个世纪的显微镜等仪器,却得出来和前人相同的结论甚至还不如前人(李时珍起码说这个东西可入药,这些人连个屁也研究不出来),真是让我等草民目瞪口呆了。

可能各位和我一样都有个疑问,专家都是干什么的呢(ni)?这些人吃饱了,事情都干得怎么样呢?就让人气得吐血的是,报纸和电视上经常说,“天气变冷,专家提醒您注意感冒”或者说“专家提醒出行注意安全”。我考,这还用专家提醒吗?用脚趾头都能想到。这是shit到极点了。要不就是我们的智商真的有问题了。

呕吐物: 血

阅读全文...

2007年1月18日

Bash 提示五则

这是我所见过的 Bash 提示当中非常 Cool 的几个,使用它们能够让你充分地享受到 CLI 的高效,并免除重复输入的麻烦,从而节省大量地时间。

1. 清屏

一般来讲,为了清屏,我们通常使用 clear 命令。你有没有试过它的快捷键 Ctrl+L?个人认为使用组合键操作更快捷。

2. 逆向搜索

有时候我们需要重新执行先前输入的命令。那么,在使用快捷键 Ctrl+R 后输入命令,Bash 将为你自动完成。

3. 命令置换

谁都避免不了输入错误命令的情况,不要紧,可以使用 ^texttosobstitute^sobstitution 来置换。比如,你输入了一个 sudo apt-get updkte 的错误命令,Bash 当然无法执行它了,这时可以通过输入 ^updkte^update(或 ^k^a)来纠正错误。

4. 重复上次的操作

如果你想要重复执行上次的命令,那么只需输入 !! 即可。

5. 重复上次的参数

如果你想要重复使用上次所用命令的参数,则可以使用 !$。举个例子,假如你上次执行的命令为 ls -lsh,那么,现在可以用 ls !$ 来达到同样的目的。

阅读全文...

2007年1月17日

linux下locale的清理

自己摸索终于知道locale清理的办法了。
两种方法,一种是通用的,一种只是针对ubuntu的。

通用方法:
1.删除 /usr/lib/locale/ 下全部文件(建议先备份)
rm -rf /usr/lib/locale/*
2.执行命令 localedef ,根据需要重新加入需要的locale。例子是增加中文的。
localedef -i zh_CN -f GB18030 zh_CN
localedef -i zh_CN -f GBK zh_CN
localedef -i zh_CN -f UTF-8 zh_CN
localedef -i zh_CN -f GB2312 zh_CN
localedef -i zh_HK -f UTF-8 zh_CN
localedef -i zh_HK -f BIG5-HKSCS zh_CN
localedef -i zh_TW -f EUC-TW zh_CN
localedef -i zh_TW -f UTF-8 zh_CN
localedef -i zh_TW -f BIG5 zh_CN

ubuntu下的方法:
ubuntu提供了locale-gen 命令,这样就方便一些:
1.修改 /etc/belocs/locale-gen.conf 中的
PURGE=yes
修改 /var/lib/locales/supported.d/ 目录下
删除en中其他的英语只保留
en_US.UTF8
新建zh包含你要的中文locale,比如zh就是
zh_CN.UTF8 UT8
zh_CN.GBK GBK
在local中设置你默认的locale
2.运行 sudo locale-gen 重新生成locale

阅读全文...

2007年1月16日

老虎、兔子、山羊的世界

一个故事……

老虎天天不是吃这个,就是吃那个,吓得很多动物都想巴结老虎,想和老虎攀上亲。老虎当然想让动物们都来巴结它喽,都围着它的指挥棒转,这该是多么美好的事。

兔子去和老虎亲近,获得成功,兔子和老虎成了好朋友,天天厮混在一起,好得不得了,老虎经常帮兔子拔草。老虎还经常拉着兔子,到处笑眯眯地演说:“现在是平等、自由、博爱、和谐。”

山羊一看,羡慕得了不得。心想:“都说老虎凶恶,看来是假的,我也赶紧去和它结成友邦吧。”

山羊梳洗打扮一番,高高兴兴地到老虎那儿去。一到那里,马上就被老虎扑到在地。老虎张开血盆大口,就要咬山羊的喉咙。山羊吓得尿都出来了,忙问:“我真心实意想和您交往,想让您扶我一把,你为什么要吃我?那兔子你为什么不吃?你不是亲口说平等、自由、博爱、和谐的么?”

老虎嘿嘿一阵冷笑,说:“你是真傻还是假傻呀?好,今天你死我就叫你死个明白,我告诉你吧,兔子太小,连我的牙缝都塞不满,我吃它干啥?我要吃的就是你,你又大又肥!我和兔子友好,就是为了你。别的动物谁都能和我友好,就惟独你不能。如果没有你,我就要吃兔子了。当今这个世界,就是你吃我我吃你的世界,残杀是必然存在的,友谊只是暂时的需要,就象我和兔子的友谊一样。如果你懂得道理,你就应该象狮子一样,长出自己的长牙和利爪来,我敢轻视你么?你现在明白了么?你说你傻不?”

山羊听完,叹了一口气,说:“朝闻道,夕死可矣。我现在明白了这个道理,死也值了。请饱餐吧。”

阅读全文...

2007年1月15日

linux下安装adsl另一方法

在不用rp-pppoe的情况下,只安装ppp,应该算最小安装了。

a.内核支持
不忘安装网卡的驱动和pppoe支持

b.安装 ppp
(下载地址 ftp://ftp.samba.org/pub/ppp/ppp-2.4.4.tar.gz 。也可以选择最新版本。)

./configure --prefix=/usr &&
make &&
make install &&
make install-etcppp

c.配置 pppoe 帐户

cat >/etc/ppp/peers/pppoe <<"EOF"
# there's no need to install rp-pppoe
plugin rp-pppoe.so
# Replace "eth0" with your network interface name
eth0
# Replace "你的帐户名" with your username at the ISP
user "你的帐户名"

# The settings below usually don't need to be changed
noauth
hide-password
updetach
debug
defaultroute
noipdefault
usepeerdns
remotename pppoe

EOF

d.配置密码

touch /etc/ppp/pap-secrets
chmod 600 /etc/ppp/pap-secrets
cat >/etc/ppp/pap-secrets <<"EOF"
# username remotename password IP for the peer
"你的帐户名" * "你的密码" *
EOF

e.拨号连接与断开

连接:
pppd call pppoe

断开:
killall pppd

阅读全文...

2007年1月14日

深入理解软件包的配置、编译与安装

前言
从源代码安装过软件的朋友一定对 ./configure && make && make install 安装三步曲非常熟悉了。然而究竟这个过程中的每一步幕后都发生了些什么呢?本文将带领你一探究竟。深入理解这个过程将有助于你在LFS的基础上玩出自己的花样来。不过需要说明的是本文对 Makefile 和 make 的讲解是相当近视和粗浅的,但是对于理解安装过程来说足够了。

概述
用一句话来解释这个过程就是:
根据源码包中 Makefile.in 文件的指示,configure 脚本检查当前的系统环境和配置选项在当前目录中生成 Makefile 文件(还有其它本文无需关心的文件),然后 make 程序就按照当前目录中的 Makefile 文件的指示将源代码编译为二进制文件,最后将这些二进制文件移动(即安装)到指定的地方(仍然按照 Makefile 文件的指示)。

由此可见 Makefile 文件是幕后的核心。要深入理解安装过程,必须首先对 Makefile 文件有充分的了解。本文将首先讲述 Makefile 与 make ,然后再讲述 configure 脚本。并且在讲述这两部分内容时,提供了尽可能详细的、可以运用于实践的参考资料。

Makefile 与 make
用一句话来概括Makefile 与 make 的关系就是:
Makefile 包含了所有的规则和目标,而 make 则是为了完成目标而去解释 Makefile 规则的工具。

make 语法
首先看看 make 的命令行语法:

make [options] [targets] [VAR=VALUE]...

[options]是命令行选项,可以用 make --help 命令查看全部,[VAR=VALUE]是在命令行上指定环境变量,这两个大家都很熟悉,将在稍后详细讲解。而[targets]是什么呢?字面的意思是" 目标",也就是希望本次 make 命令所完成的任务。凭经验猜测,这个[targets]大概可以用"ckeck","install"之类(也就是常见的测试和安装命令)。但是它到底是个啥玩意儿?没有任何参数的 make 命令是什么意思?为什么在安装 LFS 工具链中的 Perl-5.8.8 软件包时会出现"make perl utilities"这样怪异的命令?要回答这些问题必须首先理解 Makefile 文件中的"规则"。

Makefile 规则
Makefile 规则包含了文件之间的依赖关系和更新此规则目标所需要的命令。

一个简单的 Makefile 规则是这样写的:

TARGET : PREREQUISITES
COMMAND

TARGET
规则的目标。也就是可以被 make 使用的"目标"。有些目标可以没有依赖而只有动作(命令行),比如"clean",通常仅仅定义一系列删除中间文件的命令。同样,有些目标可以没有动作而只有依赖,比如"all",通常仅仅用作"终极目标"。
PREREQUISITES
规则的依赖。通常一个目标依赖于一个或者多个文件。
COMMAND
规则的命令行。一个规则可以有零个或多个命令行。

OK! 现在你明白[targets]是什么了,原来它们来自于 Makefile 文件中一条条规则的目标。另外,Makefile文件中第一条规则的目标被称为"终极目标",也就是你省略[targets]参数时的目标。

当你查看一个实际的 Makefile 文件时,你会发现有些规则非常复杂,但是它都符合规则的基本格式。此外,Makefile 文件中通常还包含了除规则以外的其它很多东西,不过本文只关心其中的变量。

Makefile 变量
Makefile 中的"变量"更像是 C 语言中的宏,代表一个文本字符串(变量的值),可以用于规则的任何部分。变量的定义很简单:VAR=VALUE;变量的引用也很简单:$(VAR) 或者 ${VAR}。变量引用的展开过程是严格的文本替换过程,就是说变量值的字符串被精确的展开在变量被引用的地方。比如,若定义:VAR=c,那么,"$ (VAR) $(VAR)-$(VAR) VAR.$(VAR)"将被展开为"c c-c VAR.c"。

虽然在 Makefile 中可以直接使用系统的环境变量,但是也可以通过在 Makefile 中定义同名变量来"遮盖"系统的环境变量。另一方面,我们可以在调用 make 时使用 -e 参数强制使系统中的环境变量覆盖 Makefile 中的同名变量,除此之外,在调用 make 的命令行上使用 VAR=VALUE 格式指定的环境变量也可以覆盖 Makefile 中的同名变量。

Makefile 实例
下面看一个简单的、实际的Makefile文件:

CC=gcc
CPPFLAGS=
CFLAGS=-O2 -pipe
LDFLAGS=-s
PREFIX=/usr

all : prog1 prog2

prog1 : prog1.o
$(CC) $(LDFLAGS) -o prog1 prog1.o

prog1.o : prog1.c
$(CC) -c $(CFLAGS) prog1.c

prog2 : prog2.o
$(CC) $(CFLAGS) $(LDFLAGS) -o prog2 prog2.o

prog2.o : prog2.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) prog2.c

clean :
rm -f *.{o,a} prog{1,2}

install : prog1 prog2
if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
cp -f prog1 $(PREFIX)/bin/prog1
cp -f prog2 $(PREFIX)/bin/prog2

check test : prog1 prog2
prog1 <> sample1.rz
prog1 <> sample3.rz
cmp sample1.ok sample1.rz
cmp sample2.ok sample2.rz

从中可以看出,make 与 make all 以及 make prog1 prog2 三条命令其实是等价的。而常用的 make check 和 make install 也找到了归属。同时我们也看到了 Makefile 中的各种变量是如何影响编译的。针对这个特定的 Makefile ,你甚至可以省略安装三步曲中的 make 命令而直接使用 make install 进行安装。

同样,为了使用自定义的编译参数编译 prog2 ,我们可以使用 make prog2 CFLAGS="-O3 -march=athlon64" 或 CFLAGS="-O3 -march=athlon64" && make -e prog2 命令达到此目的。

Makefile 惯例
下面是Makefile中一些约定俗成的目标名称及其含义:

all
编译整个软件包,但不重建任何文档。一般此目标作为默认的终极目标。此目标一般对所有源程序的编译和连接使用"-g"选项,以使最终的可执行程序中包含调试信息。可使用 strip 程序去掉这些调试符号。
clean
清除当前目录下在 make 过程中产生的文件。它不能删除软件包的配置文件,也不能删除 build 时创建的那些文件。
distclean
类似于"clean",但增加删除当前目录下的的配置文件、build 过程产生的文件。
info
产生必要的 Info 文档。
check 或 test
完成所有的自检功能。在执行检查之前,应确保所有程序已经被创建(但可以尚未安装)。为了进行测试,需要实现在程序没有安装的情况下被执行的测试命令。
install
完成程序的编译并将最终的可执行程序、库文件等拷贝到指定的目录。此种安装一般不对可执行程序进行 strip 操作。
install-strip
和"install"类似,但是会对复制到安装目录下的可执行文件进行 strip 操作。
uninstall
删除所有由"install"安装的文件。
installcheck
执行安装检查。在执行安装检查之前,需要确保所有程序已经被创建并且被安装。
installdirs
创建安装目录及其子目录。它不能更改软件的编译目录,而仅仅是创建程序的安装目录。

下面是 Makefile 中一些约定俗成的变量名称及其含义:

这些约定俗成的变量分为三类。第一类代表可执行程序的名字,例如 CC 代表编译器这个可执行程序;第二类代表程序使用的参数(多个参数使用空格分开),例如 CFLAGS 代表编译器执行时使用的参数(一种怪异的做法是直接在 CC 中包含参数);第三类代表安装目录,例如 prefix 等等,含义简单,下面只列出它们的默认值。

AR 函数库打包程序,可创建静态库.a文档。默认是"ar"。
AS 汇编程序。默认是"as"。
CC C编译程序。默认是"cc"。
CXX C++编译程序。默认是"g++"。
CPP C/C++预处理器。默认是"$(CC) -E"。
FC Fortran编译器。默认是"f77"。
PC Pascal语言编译器。默认是"pc"。
YACC Yacc文法分析器。默认是"yacc"。

ARFLAGS 函数库打包程序的命令行参数。默认值是"rv"。
ASFLAGS 汇编程序的命令行参数。
CFLAGS C编译程序的命令行参数。
CXXFLAGS C++编译程序的命令行参数。
CPPFLAGS C/C++预处理器的命令行参数。
FFLAGS Fortran编译器的命令行参数。
PFLAGS Pascal编译器的命令行参数。
YFLAGS Yacc文法分析器的命令行参数。
LDFLAGS 链接器的命令行参数。

prefix /usr/local
exec_prefix $(prefix)
bindir $(exec_prefix)/bin
sbindir $(exec_prefix)/sbin
libexecdir $(exec_prefix)/libexec
datadir $(prefix)/share
sysconfdir $(prefix)/etc
sharedstatedir $(prefix)/com
localstatedir $(prefix)/var
libdir $(exec_prefix)/lib
infodir $(prefix)/info
includedir $(prefix)/include
oldincludedir $(prefix)/include
mandir $(prefix)/man
srcdir 需要编译的源文件所在的目录,无默认值


make 选项
最后说说 make 的命令行选项(以Make-3.81版本为准):

-B, --always-make
无条件的重建所有规则的目标,而不是根据规则的依赖关系决定是否重建某些目标文件。
-C DIR, --directory=DIR
在做任何动作之前先切换工作目录到 DIR ,然后再执行 make 程序。
-d
在 make 执行过程中打印出所有的调试信息。包括:make 认为那些文件需要重建;那些文件需要比较它们的最后修改时间、比较的结果;重建目标所要执行的命令;使用的隐含规则等。使用该选项我们可以看到 make 构造依赖关系链、重建目标过程的所有信息,它等效于"-debug=a"。
--debug=FLAGS
在 make 执行过程中打印出调试信息。FLAGS 用于控制调试信息级别:

a
输出所有类型的调试信息
b
输出基本调试信息。包括:那些目标过期、是否重建成功过期目标文件。
v
除 b 级别以外还包括:解析的 makefile 文件名,不需要重建文件等。
i
除 b 级别以外还包括:所有使用到的隐含规则描述。
j
输出所有执行命令的子进程,包括命令执行的 PID 等。
m
输出 make 读取、更新、执行 makefile 的信息。

-e, --environment-overrides
使用系统环境变量的定义覆盖 Makefile 中的同名变量定义。
-f FILE, --file=FILE, --makefile=FILE
将 FILE 指定为 Makefile 文件。
-h, --help
打印帮助信息。
-i, --ignore-errors
忽略规则命令执行过程中的错误。
-I DIR, --include-dir=DIR
指定包含 Makefile 文件的搜索目录。使用多个"-I"指定目录时,搜索目录按照指定顺序进行。
-j [N], --jobs[=N]
指定并行执行的命令数目。在没有指定"-j"参数的情况下,执行的命令数目将是系统允许的最大可能数目。
-k, --keep-going
遇见命令执行错误时不终止 make 的执行,也就是尽可能执行所有的命令,直到出现致命错误才终止。
-l [N], --load-average[=N], --max-load[=N]
如果系统负荷超过 LOAD(浮点数),不再启动新任务。
-L, --check-symlink-times
同时考察符号连接的时间戳和它所指向的目标文件的时间戳,以两者中较晚的时间戳为准。
-n, --just-print, --dry-run, --recon
只打印出所要执行的命令,但并不实际执行命令。
-o FILE, --old-file=FILE, --assume-old=FILE
即使相对于它的依赖已经过期也不重建 FILE 文件;同时也不重建依赖于此文件任何文件。
-p, --print-data-base
命令执行之前,打印出 make 读取的 Makefile 的所有数据(包括规则和变量的值),同时打印出 make 的版本信息。如果只需要打印这些数据信息,可以使用 make -qp 命令。查看 make 执行前的预设规则和变量,可使用命令 make –p -f /dev/null 。
-q, --question
"询问模式"。不运行任何命令,并且无输出,只是返回一个查询状态。返回状态为 0 表示没有目标需要重建,1 表示存在需要重建的目标,2 表示有错误发生。
-r, --no-builtin-rules
取消所有内嵌的隐含规则,不过你可以在 Makefile 中使用模式规则来定义规则。同时还会取消所有支持后追规则的隐含后缀列表,同样我们也可以在 Makefile 中使用".SUFFIXES"定义我们自己的后缀规则。此选项不会取消 make 内嵌的隐含变量。
-R, --no-builtin-variables
取消 make 内嵌的隐含变量,不过我们可以在 Makefile 中明确定义某些变量。注意,此选项同时打开了"-r"选项。因为隐含规则是以内嵌的隐含变量为基础的。
-s, --silent, --quiet
不显示所执行的命令。
-S, --no-keep-going, --stop
取消"-k"选项。在递归的 make 过程中子 make 通过 MAKEFLAGS 变量继承了上层的命令行选项。我们可以在子 make 中使用"-S"选项取消上层传递的"-k"选项,或者取消系统环境变量 MAKEFLAGS 中的"-k"选项。
-t, --touch
更新所有目标文件的时间戳到当前系统时间。防止 make 对所有过时目标文件的重建。
-v, --version
打印版本信息。
-w, --print-directory
在 make 进入一个目录之前打印工作目录。使用"-C"选项时默认打开这个选项。
--no-print-directory
取消"-w"选项。可以是用在递归的 make 调用过程中,取消"-C"参数将默认打开"-w"。
-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
设定 FILE 文件的时间戳为当前时间,但不改变文件实际的最后修改时间。此选项主要是为实现了对所有依赖于 FILE 文件的目标的强制重建。
--warn-undefined-variables
在发现 Makefile 中存在对未定义的变量进行引用时给出告警信息。此功能可以帮助我们调试一个存在多级套嵌变量引用的复杂 Makefile 。但是:我们建议在书写 Makefile 时尽量避免超过三级以上的变量套嵌引用。

configure
此阶段的主要目的是生成 Makefile 文件,是最关键的运筹帷幄阶段,基本上所有可以对安装过程进行的个性化调整都集中在这一步。

configure 脚本能够对 Makefile 中的哪些内容产生影响呢?基本上可以这么说:所有内容,包括本文最关心的 Makefile 规则与 Makefile 变量。那么又是哪些因素影响着最终生成的 Makefile 文件呢?答曰:系统环境和配置选项。

配置选项的影响是显而易见的。但是"系统环境"的概念却很宽泛,包含很多方面内容,不过我们这里只关心环境变量,具体说来就是将来会在 Makefile 中使用到的环境变量以及与 Makefile 中的变量同名的环境变量。

通用 configure 语法
在进一步讲述之前,先看看 configure 脚本的语法,一般有两种:

configure [OPTIONS] [VAR=VALUE]...

configure [OPTIONS] [HOST]

不管是哪种语法,我们都可以用 configure --help 查看所有可用的[OPTIONS],并且通常在结尾部分还能看到这个脚本所关心的环境变量有哪些。在本文中将对这两种语法进行合并,使用下面这种简化的语法:

configure [OPTIONS]

这种语法能够被所有的 configure 脚本所识别,同时也能通过设置环境变量和使用特定的[OPTIONS]完成上述两种语法的一切功能。

通用 configure 选项
虽然每个软件包的 configure 脚本千差万别,但是它们却都有一些共同的选项,也基本上都遵守相同的选项语法。

脚本自身选项
--help
显示帮助信息。
--version
显示版本信息。
--cache-file=FILE
在FILE文件中缓存测试结果(默认禁用)。
--no-create
configure脚本运行结束后不输出结果文件,常用于正式编译前的测试。
--quiet, --silent
不显示脚本工作期间输出的"checking ..."消息。

目录选项
--srcdir=DIR
源代码文件所在目录,默认为configure脚本所在目录或其父目录。
--prefix=PREFIX
体系无关文件的顶级安装目录PREFIX ,默认值一般是 /usr/local 或 /usr/local/pkgName
--exec-prefix=EPREFIX
体系相关文件的顶级安装目录EPREFIX ,默认值一般是 PREFIX
--bindir=DIR
用户可执行文件的存放目录DIR ,默认值一般是 EPREFIX/bin
--sbindir=DIR
系统管理员可执行目录DIR ,默认值一般是 EPREFIX/sbin
--libexecdir=DIR
程序可执行目录DIR ,默认值一般是 EPREFIX/libexec
--datadir=DIR
通用数据文件的安装目录DIR ,默认值一般是 PREFIX/share
--sysconfdir=DIR
只读的单一机器数据目录DIR ,默认值一般是 PREFIX/etc
--sharedstatedir=DIR
可写的体系无关数据目录DIR ,默认值一般是 PREFIX/com
--localstatedir=DIR
可写的单一机器数据目录DIR ,默认值一般是 PREFIX/var
--libdir=DIR
库文件的安装目录DIR ,默认值一般是 EPREFIX/lib
--includedir=DIR
C头文件目录DIR ,默认值一般是 PREFIX/include
--oldincludedir=DIR
非gcc的C头文件目录DIR ,默认值一般是 /usr/include
--infodir=DIR
Info文档的安装目录DIR ,默认值一般是 PREFIX/info
--mandir=DIR
Man文档的安装目录DIR ,默认值一般是 PREFIX/man

体系结构选项
玩交叉编译的朋友对这些选项已经很熟悉了,并且对于通常的交叉编译情况而言,HOST == BUILD != TARGET 。但是对于不使用交叉编译的朋友也不必担心,将它们三个都设为相同即可。

--host=HOST
运行工具链的机器,默认是 config.guess 脚本的输出结果。
--build=BUILD
用来建立工具链的机器,默认值是 HOST
--target=TARGET
工具链所生成的二进制代码最终运行的机器,默认值是 HOST

特性与额外软件包选项
--enable-FEATURE
启用FEATURE特性
--disable-FEATURE
禁用FEATURE特性
--with-PACKAGE[=DIR]
启用附加软件包PACKAGE,亦可同时指定PACKAGE所在目录DIR
--without-PACKAGE
禁用附加软件包PACKAGE

通用环境变量
除了上述通用的选项外,下列环境变量影响着最终生成的 Makefile 文件:

至于设置这些环境变量的方法,你可以将它们 export 为全局变量在全局范围内使用,也可以在命令行上使用 [VAR=VALUE]... configure [OPTIONS] 的语法局部使用。此处就不详细描述了。

CPP
C预处理器命令
CXXCPP
C++预处理器命令
CPPFLAGS
C/C++预处理器命令行参数
CC
C编译器命令
CFLAGS
C编译器命令行参数
CXX
C++编译器命令
CXXFLAGS
C++编译器命令行参数
LDFLAGS
连接器命令行参数

阅读全文...

2007年1月13日

Подмосковные Вечера



Не слышны в саду даже шорохи,
Все здесь замерло до утра.
Если б знали вы, как мне дороги
Подмосковные вечера.

Речка движется и не движется,
Вся из лунного серебра.
Песня слышится и не слышится
В эти тихие вечера.

Что ж ты милая, смотришь искоса,
Низко голову наклоня?
Трудно высказать и не высказать
Все, что на сердце у меня.

А рассвет уже все заметнее...
Так, пожалуйста, будь добра,
Не забудь и ты эти летние
Подмосковные вечера!

阅读全文...

2007年1月12日

放弃LFS 6.2

再次完成了LFS 6.2,然后安装unicon。无效!

因为这次的目的就是unicon,既然失败就索性放弃,因为已经有6.1的,没有必要再搞一个。

下一步还是将原有的再研究一下。

还有是选择arch linux尝试一下。

阅读全文...

2007年1月11日

小光棍节

现在的人真是有意思,11.11是光棍节,1.11是小光棍节。大概今后1.1改成小小光棍节了。

想想小时候,过年就像一件很隆重很郑重的事情,现在的过年也没有什么味道。甚至不想过年了——越是过年越是忙,倒不如轻松一下。

象这种光棍节之类的,哈哈一笑,就算过完节了,这种节日倒是真的给人带来了欢乐。

阅读全文...

2007年1月10日

再次制作LFS

曾经完成LFS 6.1,现在有6.2了,又有些时间,又忍不住手痒,再做一个。

由于最近的网络比较慢,有些不方便。不过这样也好,慢慢做,多学点,而不是为了图完成结果。

计划这次还是使用纯console,基本与原来的差不多。不过这次计划安装unicon,以前是cce2k,这样在内核级支持中文。但是unicon已经多年没有更新了,又是由日本人在维护,看来又要去拾起日语了。

要学习的太多了。

阅读全文...

2007年1月9日

linux下字体安装

在linux下字体安装就是“程咬金三斧头”——

第一 拷贝字体文件
拷贝字体到 XF86Config-4 或 xorg.conf 文件里面特定的 FontPath 指定的目录。一般情况下,是拷贝到 /usr/share/fonts/ 下面或更下面的目录中。

第二 配置 Core 字体
进到你刚才所拷贝的字体目录,运行 ttmkfdir 生成一个字体描述方案,就是类似 -misc-SimSun-medium-r-normal--0-0-0-0-p-0-ascii-0 好多行凑成了这么一个文件fonts.dir 。再拷贝成 fonts.scale。这样 Core 字体系统就会根据这些描述调用具体的相关字体,只要 是同一个字体,就是通用的。总之这步,就是正确的生成两个一模一样的文件 fonts.dir 和 fonts.scale 。

第三 配置 Xft 字体
这步就简单了。fc-cache -fv 就会自动把字体加入到了列表。

判断 第二步 正确完成的标志是 你在 xlsfonts 列表里找到你刚刚安装的字体。
判断 第三步 正确完成的标志是 你在 fc-list 列表里找到你刚刚安装的字体。

由于 X 目前存在两个字体系统,所以才需要上面的 二三 两步。
当然总有一天,core字体是会消失的,xft字体是往后发展的主流。

阅读全文...

2007年1月8日

mldonkey的基本使用

现在用mldonkey的人并不是很多,但它还是有很多的好处的,支持很多流行的p2p网络,目前支持的协议有 eDonkey, Overnet, Bittorrent, Gnutella (Bearshare, Limewire,etc), Gnutella2 (Shareaza), Fasttrack (Kazaa, Imesh, Grobster), Soulseek (beta), Direct-Connect (alpha), Opennap (alpha)。通过插件形式,基本上大的p2p网络都支持了。 其它的好处如支持多个os平台,能安装在其它机器上进行远程管理,在使用ed2k的时候还可以同时连接多个服务器等等。

这个软件的核心是一个控制台程序 mldonkey,可以以一个daemon的方式运行,另外有三种远程的管理方式:telnet和www,还有基于GTK的图形化的前端mldonkey-gui。

主要配置文件有这样几个
~/.mldonkey/downloads.ini 基本的设置( 这个是for edonkey和其他协议的)
~/.mldonkey/servers.ini 服务器列表文件,可以在mldonkey-gui的console里面输入servers "/xxx/yyy/server.met"来导入网上下载的server.met服务器列表
~/.mldonkey/files.ini 当前已经完成的和未完成的文件列表
~/.mldonkey/friends.ini 好友列表
~/.mldonkey_gui.ini 图形前端的配置文件
另外其他的网络协议都有其单独的配置文件,一般都放在~/.mldonkey目录下

如何使用mldonkey:
在终端输入mlnet就可以了,如果想让它在后台运行,使用
mlnet &> /dev/null (加>/dev/null的目的是不让它生成无用的log文件)
然后任何时间运行mldonkey-gui就可以对其进行操作

基础的设置:
要手工修改设置文件,首先肯定mldonkey 并没有运行,否则它会覆盖你做的修改

client_name
设置nickname,这个和emule一样,有些server需要特殊的nickname才可以连上

shared_directories
共享的文件夹路径在这里设置,默认[]就是不共享

allow_browse_share
是否容许别人浏览你共享的文件,我是选false

gui_port = 4001
http_port = 4080
telnet_port = 4000
三种操控方式使用的端口,记得如果在这里修改了gui的端口,也要在gui的设置中同样更改

allowed_ips = ["127.0.0.1";]
容许控制端联接的ip列表,可以使用简单的通配符如*和?

max_hard_upload_rate
max_hard_download_rate
如果要限制传输速度,就设置这两个参数,0表示不限,单位是KB

enable_overnet
enable_bittorrent
enable_donkey
enable_opennap
enable_soulseek
enable_gnutella
enable_fasttrack
enable_directconnect
各种p2p协议,想使用的话就true,不想用就设置成false

max_concurrent_downloads
最大容许的同时下载线程,默认是60,如果对自己带宽有信心可以设大点,我 512K adsl远远用不了60,所以不动

temp_directory
incoming_directory
auto_commit
下载中未完成的文件存放路径和完成的文件存放的路径,auto_commit表示mldonkey会自动把下载完成的文件从temp_directory移动到incoming_directory里面

ask_for_gui
启动时询问是否开启mldonkey_gui,如果觉得这个对话框很烦就设置成false,以后自己手动运行mldonkey_gui随时都可以连的上
start_gui
是否自动运行gui界面

阅读全文...

2007年1月7日

在这个特殊的日子,写下这一段一样的文字。

和平来自不易,即使是表面的平静也是好的。

因为仅仅是表面平静,其实已经无法整理。

一旦整理,就会有轩然大波。

之后或许会得到真正的平静,但是更大的可能是永无宁日,即使这种虚假的平静也会不复存在。

阅读全文...

2007年1月6日

心烦意乱

最近不知为什么,总是觉得心烦意乱,没有好心情,也没有兴趣做事情。

不知为什么,难道是年底综合症?一年过去了,很多事情告一段落,新的事情还没有打算,现在处于青黄不接的时候,忙了一年后感觉无所事事,落差还没有适应过来。

阅读全文...

2007年1月5日

孩子的奇怪动作

小孩子有一个奇怪的动作——

每次跌跤后,不哭也不闹,先不忙着爬起来,而是先拿小手拍拍地板;如果是哪里撞了一下,比如墙上或是桌子上,就用小手拍两下那个地方,然后爬起来。

看到这个现象,我很好笑。但是看着孩子认真的严肃的样子,突然想到一个字眼——仪式。没错,任何的仪式在不相信的人的眼里,都是那么可笑,但对于仪式的参与者、实行者他们都是那么认真投入。孩子在这么做的时候,他自己肯定认为是神圣伟大的动作,可以消除疼痛,并得到心灵上的安慰。如同教徒在祈祷的时候一样的虔诚。

这个动作想必是爷爷奶奶领的时候,一旦孩子摔倒,为了安慰孩子,打几下地板或是桌子什么的,孩子就学会了。

有人说这样子不好,因为专家说了,这样的孩子今后就学会了推卸责任,对社会不好。但不管怎么样,孩子只要不哭,就很好。再说了现在的社会,如果不学会推卸责任,真不知该如何生存。

话说回来,这个小孩确实有点勇敢,不怕疼,力气又大,以后大概也会向武的这方面发展。这样也好,他的爸爸妈妈太文弱了。

不知道为什么,从一个小动作想到了这么多,杂七杂八扯了这么多。

阅读全文...

2007年1月4日

轻松获得网通、电信、铁通IP地址分配段

  APNIC是管理亚太地区IP地址分配的机构 ,它有着丰富准确的IP地址分配库,同时这些信息也是对外公开的!下面就让我们看看如何在Linux下获得一些电信运营商的IP地址分配情况

shell> wget http://ftp.apnic.net/apnic/dbase/tools/ripe-dbase-client-v3.tar.gz
shell> tar xzvf ripe-dbase-client-v3.tar.gz
shell> cd whois-3.1
shell> ./configure
shell> make
完成上述编译安装工作后,我们开始获取IP地址段;

  中国网通:shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CNCGROUP > /var/cnc

  中国电信:shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CHINANET > /var/chinanet

  中国铁通:shell> ./whois3 -h whois.apnic.net -l -i mb MAINT-CN-CRTC > /var/crtc

  打开获取后的文件可以看到里面的信息非常详细,甚至可以看到各个分公司的负责人、电话、电子邮件等等信息。如果想得到一份整齐干净的IP地址段文件,只要用grep和awk简单过滤就可以了。

阅读全文...

2007年1月3日

awk 用法

awk 用法:awk ‘ pattern {action} ‘

变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符


1、
awk ‘/101/’ file 显示文件file中包含101的匹配行。
awk ‘/101/,/105/’ file
awk ‘$1 == 5′ file
awk ‘$1 == “CT”‘ file 注意必须带双引号
awk ‘$1 * $2 >100 ‘ file
awk ‘$2 >5 && $2<=15' file

2、
awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。

3、
df | awk '$4>1000000 ‘ 通过管道符获得输入,如:显示第4个域满足条件的行。

4、
awk -F “|” ‘{print $1}’ file 按照新的分隔符“|”进行操作。
awk ‘BEGIN { FS=”[: \t|]” } {print $1,$2,$3}’ file 通过设置输入分隔符(FS=”[: \t|]”)修改输入分隔符。

Sep=”|”
awk -F $Sep ‘{print $1}’ file 按照环境变量Sep的值做为分隔符。
awk -F ‘[ :\t|]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk -F ‘[][]’ ‘{print $1}’ file 按照正则表达式的值做为分隔符,这里代表[、]

5、
awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile /101/{print “\047 Hello! \047″} –遇到匹配行以后打印 ‘ Hello! ‘.\047代表单引号。
{print $1,$2} –因为没有模式控制,打印每一行的前两个域。

6、
awk ‘$1 ~ /101/ {print $1}’ file 显示文件中第一个域匹配101的行(记录)。

7、
awk ‘BEGIN { OFS=”%”} {print $1,$2}’ file 通过设置输出分隔符(OFS=”%”)修改输出格式。

8、
awk ‘BEGIN { max=100 ;print “max=” max} BEGIN 表示在处理任意行之前进行的操作。{max=($1 >max ?$1:max); print $1,”Now max is “max}’ file 取得文件第一个域的最大值。
(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
awk ‘{print ($1>4 ? “high “$1: “low “$1)}’ file

9、
awk ‘$1 * $2 >100 {print $1}’ file 显示文件中第一个域匹配101的行(记录)。

10、
awk ‘{$1 == ‘Chi’ {$3 = ‘China’; print}’ file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk ‘{$7 %= 3; print $7}’ file 将第7域被3除,并将余数赋给第7域再打印。

11、
awk ‘/tom/ {wage=$2+$3; printf wage}’ file 找到匹配行后为变量wage赋值并打印该变量。

12、
awk ‘/tom/ {count++;}
END {print “tom was found “count” times”}’ file END表示在所有输入行处理完后进行处理。

13、
awk ‘gsub(/\$/,”");gsub(/,/,”"); cost+=$4; END {print “The total is $” cost>”filename”}’ file gsub函数用空串替换$和,再将结果输出到filename中。
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00

awk ‘{gsub(/\$/,”");gsub(/,/,”");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过if和else if完成条件语句

awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条件时退出,但是仍执行END操作。
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf “c4=[%d]\n”,c4}”‘ file
通过next在某条件时跳过该行,对下一行执行操作。

14、
awk ‘{ print FILENAME,$0 }’ file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。

15、
awk ‘ $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0,” “) +1)>$1}’ fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。

16、
awk ‘BEGIN {”date”|getline d; print d}’ 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。

17、
awk ‘BEGIN {system(”echo \”Input your name:\\c\”"); getline d;print “\nYour name is”,d,”\b!\n”}’
通过getline命令交互输入name,并显示出来。
awk ‘BEGIN {FS=”:”; while(getline< "/etc/passwd" >0) { if($1~”050[0-9]_”) print $1}}’
打印/etc/passwd文件中用户名包含050x_的用户名。

18、
awk ‘{ i=1;while(i awk '{ for(i=1;i type file|awk -F "/" '
{ for(i=1;i { if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。
用for和if显示日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{
flag=0;
printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf “%02d%02d “,j,i}
}
}
}’

19、
在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk ‘{print ‘$Flag’}’ 结果为abcd
awk ‘{print “$Flag”}’ 结果为$Flag

阅读全文...

2007年1月2日

O Sole Mio



Che bella cosa na jurnata 'e sole,
n'aria serena doppo na tempesta!
Pe' ll'aria fresca pare gia' na festa
Che bella cosa na jurnata 'e sole.
 

Ma n'atu sole
cchiu' bello, oi ne'.
'O sole mio
sta 'nfronte a te!
'O sole, 'o sole mio
sta 'nfronte a te,
sta 'nfronte a te!
 

Lùcene 'e llastre d''a fenesta toia;
'na lavannara canta e se ne vanta
e pe' tramente torce, spanne e canta
lùcene 'e llastre d'a fenesta toia.

Ma n'atu sole
cchiu' bello, oi ne'.
'O sole mio
sta 'nfronte a te!
 

Quanno fa notte e 'o sole se ne scenne,
me vene quase 'na malincunia;
sotto 'a fenesta toia restarria
quanno fa notte e 'o sole se ne scenne.

Ma n'atu sole
cchiu' bello, oi ne'.
'O sole mio
sta 'nfronte a te!

阅读全文...

2007年1月1日

新年展望

新年到了,新的希望也来了。

1.家庭是最重要的。在新年要好好维护家庭,有温馨美好的家庭才有一切。

2.要学习——时间有限啊,要学习的东西太多了:深入学习linux,最好学会linux下编程;学会做人,真正到社会中去好好学习、探索这个社会,而不是通过网络和他人。

3.让孩子健健康康的成长——孩子是我的未来,我的希望,我可以什么都不要,但就是舍不得这个可爱的宝宝。

4.要写一些故事——酝酿很久了,想必今后肯定要给孩子讲故事的,我先编故事吧,大概今后也能出个1001夜或是xx童话之类的:P

5.开心过好每一天。不过这个最简单的愿望,其实是最难的事情。

阅读全文...